값에 줄 바꾸기 문자가있는 JSON 문자열을 형성해야합니다. 이스케이프 처리 한 다음 AJAX 호출을 사용하여 게시해야합니다. JavaScript로 문자열을 이스케이프 처리하는 방법을 제안 할 수 있습니까? jQuery를 사용하지 않습니다.
값에 줄 바꾸기 문자가있는 JSON 문자열을 형성해야합니다. 이스케이프 처리 한 다음 AJAX 호출을 사용하여 게시해야합니다. JavaScript로 문자열을 이스케이프 처리하는 방법을 제안 할 수 있습니까? jQuery를 사용하지 않습니다.
답변:
JSON을 가져 가십시오 .stringify()
. 그런 다음 .replace()
방법을 사용하고 모든 발생을 \n
로 바꿉니다 \\n
.
편집하다:
내가 아는 한 문자열에서 모든 특수 문자를 이스케이프 처리하는 잘 알려진 JS 라이브러리는 없습니다. 그러나 .replace()
메소드를 연결하고 다음과 같이 모든 특수 문자를 바꿀 수 있습니다 .
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server.
그러나 그것은 매우 불쾌하지 않습니까? 함수의 아름다움을 입력하면 코드를 여러 조각으로 나누고 스크립트의 주요 흐름을 깨끗하게 유지하고 8 개의 체인 .replace()
호출을 피할 수 있습니다. 이 기능을이라는 함수에 넣겠습니다 escapeSpecialChars()
. 계속 prototype chain
해서 String
객체 의 객체에 escapeSpecialChars()
연결하여 String 객체를 직접 호출 할 수 있습니다 .
이렇게 :
String.prototype.escapeSpecialChars = function() {
return this.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
};
해당 함수를 정의하면 코드의 본문은 다음과 같이 간단합니다.
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
사용자에 따라 백 슬래시 교체를 먼저 재정렬하고 견적 교체를 수정하는 것을 제외하고는 667073이 제안했습니다.
escape = function (str) {
return str
.replace(/[\\]/g, '\\\\')
.replace(/[\"]/g, '\\\"')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t');
};
Line separator
\u2028
및 Paragraph separator
\u2029
. 참조 : es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
당신처럼, 나는 여러 주석을 조사하고 그 안에 html 객체를 포함하는 JSON의 특수 이스케이프 문자를 대체하기 위해 게시했습니다.
내 객체는 JSON 객체의 특수 문자를 제거하고 json 객체 내부의 HTML을 렌더링하는 것입니다.
여기 내가 한 일이 있으며 사용이 매우 간단하기를 바랍니다.
먼저 JSON.stringify 내 json 객체와 JSON.parse를 수행했습니다.
예를 들어 :
JSON.parse(JSON.stringify(jsonObject));
그리고 그것은 내 문제를 해결하고 Pure Javascript를 사용하여 완료되었습니다.
stackoverflow
오류가 발생합니다.
JSON.parse(JSON.stringify($("body")))
본문과 몇 가지 테이블이있는 html 파일을 사용해보십시오 . $ ( "body")는 자바 스크립트 객체이지만 stringify는 구문 분석에 실패합니다.
Alex가 제공 한 답변이 다소 틀렸다고 말하기가 두렵습니다.
이 기능
escape = function (str) {
// TODO: escape %x75 4HEXDIG ?? chars
return str
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
; };
더 나은 근사치 인 것 같습니다.
작은 따옴표에 대한 작은 업데이트
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
.replace(/[\"]/g, '\\"')
.replace(/\\'/g, "\\'");
}
var myJSONString = JSON.stringify(myJSON,escape);
이것은 오래된 게시물입니다. angular.fromJson 및 JSON.stringify를 사용하는 사람들에게는 여전히 도움이 될 수 있습니다. escape ()는 더 이상 사용되지 않습니다. 대신 이것을 사용하십시오
var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.
심판 http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
JSON.stringify에는 두 번째 매개 변수도 있습니다. 따라서 더 우아한 해결책은 다음과 같습니다.
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
;
}
var myJSONString = JSON.stringify(myJSON,escape);
이것은 오래된 질문이지만 모든 경우를 해결하지는 못했기 때문에 솔루션이 제대로 작동하지 않았습니다. 마침내 여기서 일을 한 답을 찾았습니다 .
escape 및 encode uri 구성 요소를 사용하는 통합 솔루션을 게시합니다.
// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
var t = typeof (obj);
if (t != "object" || obj === null) {
// simple data type
if (t == "string") obj = '"'+obj+'"';
return String(obj);
}
else {
// recurse array or object
var n, v, json = [], arr = (obj && obj.constructor == Array);
for (n in obj) {
v = obj[n]; t = typeof(v);
if (t == "string") v = '"'+v+'"';
else if (t == "object" && v !== null) v = JSON.stringify(v);
json.push((arr ? "" : '"' + n + '":') + String(v));
}
var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
return rawString;
}
};
function escape (key, val) {
if (typeof(val)!="string") return val;
var replaced = encodeURIComponent(val);
return replaced;
}
JSON.stringifyEscaped = function(obj){
return JSON.stringify(obj,escape);
}
escape = (string) -> JSON.stringify(string)[1...-1]
서버 측 스크립팅 언어가 PHP 인 경우 json_encode ()를 사용하십시오 .
json_encode()
사용하지 않는 경우 스크립팅 언어와 유사한 기능을 찾는 경우).
그런 다음 $.parseJSON()
JavaScript에서 사용 하십시오!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
PHP JSON.parse 이중 인코딩
JSON
Textarea 필드의 줄 바꿈으로 인해 오류가 발생하는 Ajax 호출 중 하나에서 동일한 상황이 발생했습니다. 여기에 주어진 해결책은 나를 위해 작동하지 않았습니다. 그래서 Javascript의 .escape
기능을 사용 했으며 정상적으로 작동했습니다. 그런 다음에서 값을 검색하기 위해 JSON
방금 이스케이프 처리했습니다 .unescape
.
내장 jQuery.serialize () 를 사용하여 텍스트 영역에서 값을 추출하여 입력을 urlencode했습니다. 장점은 모든 특수 문자를 직접 검색 할 필요가 없으며 개행을 유지하고 html을 이스케이프 처리한다는 것입니다. 직렬화가 작동하려면 입력 필드에 이름 속성이 있어야하고 이스케이프 된 문자열에 동일한 속성을 추가하여 대체해야합니다. 당신이 찾고있는 것이 아닐 수도 있지만 그것은 나를 위해 작동합니다.
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
모든 형태의 Ajax를 사용하는 경우 웹에서 CGI 서버로부터 수신 된 응답 형식에 대한 자세한 문서가 부족한 것 같습니다. 여기서 일부 항목은 jQuery에 의해 자동으로 수행되거나 Javascript 시스템 또는 라이브러리 JSON 구문 분석을 사용하여 수동으로 수행되는지 여부에 관계없이 JSON 변환에서 무한 루프 (중지)를 방지하기 위해 반환 된 텍스트 또는 json 데이터의 줄 바꿈을 이스케이프해야한다고 지적합니다 전화.
프로그래머가이 문제를 게시하는 각 경우에, 부적절한 해결책이 제시되고 (보통 보내는 쪽에서 \ n을 \\ n으로 대체) 문제가 사라집니다. Windows 경로 이름과 같이 제어 이스케이프 시퀀스를 실수로 포함하는 문자열 값을 전달할 때 부적합이 나타납니다. 예를 들어 제어 문자 ^ c 및 ^ r이 포함 된 "C : \ Chris \ Roberts.php"는 { "file": "C : \ Chris \ Roberts.php"} 문자열을 JSON으로 변환 할 수 있습니다. 영원히 반복하십시오. 이러한 값을 생성하는 한 가지 방법은 의도적으로 PHP 경고 및 오류 메시지를 서버에서 클라이언트로 전달하는 것입니다.
정의에 따라 Ajax는 뒤에서 HTTP 연결을 사용합니다. 이러한 연결은 제어 문자를 포함하여 잘못된 구문을 피하기 위해 전송 된 데이터를 인코딩해야하는 GET 및 POST를 사용하여 데이터를 전달합니다.
이것은 해결책 인 것처럼 보이는 것을 구성하기에 충분한 힌트를 제공합니다 (더 많은 테스트가 필요합니다) : PHP (송신) 측에서 rawurlencode를 사용하여 데이터를 인코딩하고 Javascript (수신) 측에서 이스케이프 처리하여 데이터를 디코딩합니다. 경우에 따라 전체 텍스트 문자열에 적용 할 수도 있고 JSON 내부의 값에만 적용 할 수도 있습니다.
이 아이디어가 올바른 것으로 판명되면 모든 수준의 프로그래머가이 문제를 한 번에 해결하는 데 도움이되는 간단한 예제를 구성 할 수 있습니다.
encodeURIComponent ()를 사용하여 문자열을 인코딩하십시오.
예 : var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
웹 서버가 자동으로 동일한 작업을 수행하므로 디코딩 할 필요가 없습니다.
정규 표현식을 사용하지 마십시오 (절대로 전혀 의미가 없음). 가장 효과적인 방법 :
String.prototype.escapeJSON = function() {
var result = "";
for (var i = 0; i < this.length; i++)
{
var ch = this[i];
switch (ch)
{
case "\\": ch = "\\\\"; break;
case "\'": ch = "\\'"; break;
case "\"": ch = '\\"'; break;
case "\&": ch = "\\&"; break;
case "\t": ch = "\\t"; break;
case "\n": ch = "\\n"; break;
case "\r": ch = "\\r"; break;
case "\b": ch = "\\b"; break;
case "\f": ch = "\\f"; break;
case "\v": ch = "\\v"; break;
default: break;
}
result += ch;
}
return result;
};