JavaScript를 사용하여 줄 바꿈 문자가 포함 된 JSON 문자열을 이스케이프 처리하는 방법은 무엇입니까?


166

값에 줄 바꾸기 문자가있는 JSON 문자열을 형성해야합니다. 이스케이프 처리 한 다음 AJAX 호출을 사용하여 게시해야합니다. JavaScript로 문자열을 이스케이프 처리하는 방법을 제안 할 수 있습니까? jQuery를 사용하지 않습니다.


1
줄 바꿈 문자 \ n을 \\ n으로 이스케이프하려고했습니다. 잘 작동합니다. 그러나 모든 이스케이프 문자에 대해이 작업을 수행 할 수있는 JS 라이브러리를 찾고 있습니다.
Srikant

1
왜 JSON 내에서 줄 바꿈을 피해야합니까? 적절한 솔루션은 관련 인코딩 기능을 사용하는 것이기 때문에 이러한 값은 사용될 때 어떻게 디코딩됩니까?
zzzzBov

나는 작은 추가 슬래시를 발견하기 위해 수많은 변형을 가진 모든 종류의 일을 6 시간 동안 보냈다. 내가 생각했던 것들이 5 분처럼 힘들어 졌다고 생각한 것들이 마술처럼 작동 할 것이라고 생각했다. .omg
Muhammad Umer

1
Server-Side php-db-saving과 함께 Ajax 호출을 사용하는 경우 php-function addslashes ()를 사용하여 변환하십시오. 이 솔루션을 사용하면 javascript-replace 행보다 변환 할 위치가 하나뿐입니다.
Marcel Ennix

답변:


135

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

3
알렉스 고마워. 모든 탈출 문자에 대해이 작업을 수행해야합니까? 이 작업을 수행 할 JS 라이브러리가 있습니까?
Srikant

2
이것은 내 문제를 해결 한 정확한 함수입니다. String.prototype.escapeSpecialChars = function () {return this.replace (/ \\ / g, "\\\\"). 바꾸기 (/ \ n / g, "\\ n"). 바꾸기 (/ \ r / g, "\\ r"). 바꾸기 (/ \ t / g, "\\ t"). 바꾸기 (/ \ f / g, "\\ f"). 바꾸기 (/ "/ g,"\\\ ""). 바꾸기 (/ '/ g, "\\\'"). 대치 (/ \ & / g, "\\ &"); }
Srikant

10
user667073의 답변에서 언급 했듯이이 솔루션에는 몇 가지 오류가 있습니다. json.org를 참조 - '& 및 것은 이스케이프.
Alexander Klimetschek

5
정규식이 잘못 된 것 같아서 이것을 투표로 투표했습니다. 나는 그것을 사용하려고했지만 슬래시 중 하나를 제거하여 정규 표현식을 수정해야했습니다. 예 : / \\ n / g는 / \ n / g이어야합니다. 자세한 내용은이 링크에서 "인쇄 할 수없는 문자"를 참조하십시오.- RegExp 정보
b01

1
그 자체는 어떻습니까? 그것도 탈출해야합니까?
arash moeen

65

사용자에 따라 백 슬래시 교체를 먼저 재정렬하고 견적 교체를 수정하는 것을 제외하고는 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');
};

3
이러한 작업을 모두 수행 할 필요는 없습니다. 백 슬래시, 줄 바꿈, 줄 바꿈 및 두 따옴표 만 있습니다. 누락되었습니다 : 작은 따옴표 Line separator \u2028Paragraph separator \u2029. 참조 : es5.github.io/#x7.3
Ariel

1
훌륭하지만 대괄호가 필요한 이유는 무엇입니까? 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'); };
요한 에차 바리 아

3
완전한. 허용 된 답변 (위의 답변)은 작동하지 않습니다. nodeJS를 사용합니다.
Yossi Shasho

이 오류가 발생합니다 :Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Pathros

32

당신처럼, 나는 여러 주석을 조사하고 그 안에 html 객체를 포함하는 JSON의 특수 이스케이프 문자를 대체하기 위해 게시했습니다.

내 객체는 JSON 객체의 특수 문자를 제거하고 json 객체 내부의 HTML을 렌더링하는 것입니다.

여기 내가 한 일이 있으며 사용이 매우 간단하기를 바랍니다.

먼저 JSON.stringify 내 json 객체와 JSON.parse를 수행했습니다.

예를 들어 :

JSON.parse(JSON.stringify(jsonObject));

그리고 그것은 내 문제를 해결하고 Pure Javascript를 사용하여 완료되었습니다.


4
이것은 확실히가는 길이다
Oz Lodriguez

1
이것은 확실히 갈 길입니다!
MartianE

1
복잡하고 큰 객체에서 stackoverflow오류가 발생합니다.
AaA

1
JSON.parse(JSON.stringify($("body")))본문과 몇 가지 테이블이있는 html 파일을 사용해보십시오 . $ ( "body")는 자바 스크립트 객체이지만 stringify는 구문 분석에 실패합니다.
AaA

나는 당신의 쿼리를 확인하고 되돌릴 것입니다.
Balasubramani M

24

Alex가 제공 한 답변이 다소 틀렸다고 말하기가 두렵습니다.

  • Alex가 이스케이프하려고하는 일부 문자는 (& 및 '와 같은) 이스케이프 할 필요가 없습니다.
  • \ b는 백 스페이스 문자가 아니라 단어 경계가 일치합니다.
  • 이스케이프해야하는 문자는 처리되지 않습니다.

이 기능

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')
    ; };

더 나은 근사치 인 것 같습니다.


5
실제로 큰 따옴표 앞에 백 슬래시를 바꾸려면 순서를 변경해야합니다. 그렇지 않으면 \\\\ "로 끝나게됩니다. 또한 따옴표는 .replace (/ [\"] / g, '\\\ " ')
Ryan

10

작은 따옴표에 대한 작은 업데이트

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);

7

이것은 오래된 게시물입니다. 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


stringify는 이미 모든 탈출을 처리합니다. 왜 그렇게 사용하지 않는지 궁금합니다. git.io/vglq7
벤 데이비스

5

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);

5

이것은 오래된 질문이지만 모든 경우를 해결하지는 못했기 때문에 솔루션이 제대로 작동하지 않았습니다. 마침내 여기서 일을 한 답을 찾았습니다 .

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]
Radek


3

서버 측 스크립팅 언어가 PHP 인 경우 json_encode ()를 사용하십시오 . json_encode() 사용하지 않는 경우 스크립팅 언어와 유사한 기능을 찾는 경우).

그런 다음 $.parseJSON()JavaScript에서 사용 하십시오!


PHP에서 Javascript로 JSON 문자열로 데이터를 전달하는 경우이 답변을 확인하십시오-이중 이스케이프, JSON.parse를 전달하고 JSON 문자열을 객체로 변환하는 데 도움이되었습니다. <script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script> PHP JSON.parse 이중 인코딩
Vladimir Vukanac

2

JSONTextarea 필드의 줄 바꿈으로 인해 오류가 발생하는 Ajax 호출 중 하나에서 동일한 상황이 발생했습니다. 여기에 주어진 해결책은 나를 위해 작동하지 않았습니다. 그래서 Javascript의 .escape기능을 사용 했으며 정상적으로 작동했습니다. 그런 다음에서 값을 검색하기 위해 JSON방금 이스케이프 처리했습니다 .unescape.


Ajax 호출을 사용하여 php-function newStr = addslashes (str)를 사용하고 db에 저장하는 것을 선호합니다. 그래서 나는 자바 스크립트-(클라이언트) 측에서 변환 할 필요가 없습니다. 이 솔루션을 사용하면 슬래시를 변환 할 위치가 하나만 필요합니다. 이 솔루션에 매우 만족합니다.
Marcel Ennix 16:12에

2

내장 jQuery.serialize () 를 사용하여 텍스트 영역에서 값을 추출하여 입력을 urlencode했습니다. 장점은 모든 특수 문자를 직접 검색 할 필요가 없으며 개행을 유지하고 html을 이스케이프 처리한다는 것입니다. 직렬화가 작동하려면 입력 필드에 이름 속성이 있어야하고 이스케이프 된 문자열에 동일한 속성을 추가하여 대체해야합니다. 당신이 찾고있는 것이 아닐 수도 있지만 그것은 나를 위해 작동합니다.

var myinputfield = jQuery("#myinputfield"); 
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');

1

모든 형태의 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 내부의 값에만 적용 할 수도 있습니다.

이 아이디어가 올바른 것으로 판명되면 모든 수준의 프로그래머가이 문제를 한 번에 해결하는 데 도움이되는 간단한 예제를 구성 할 수 있습니다.


0

이것은 고대의 게시물처럼 보입니다 :-) 그러나 내가 가지고있는 가장 좋은 해결 방법은 복잡한 코드없이 작동한다는 100 %는 base64에 인코딩 / 디코딩의 두 기능을 모두 사용하는 것입니다. 이들은 atob () 및 btoa ()입니다. 가장 쉽고 가장 좋은 방법은 탈출 할 캐릭터를 놓친 경우 걱정할 필요가 없습니다.

성 조지


같은 솔루션을 생각해 냈기 때문에. 누군가 가이 솔루션을 명확히하고 숨겨진 경고가 있는지 궁금합니다. 감사.
mahish

0

JSON 큰 따옴표를 이스케이프하지 않으면 ( "{\"foo\": true}") Google이 계속 여기에 방문하고 API에서 오류가 발생하는 경우 두 번 문자열로 묶기 만하면됩니다.JSON.stringify(JSON.stringify(bar))


-1

encodeURIComponent ()를 사용하여 문자열을 인코딩하십시오.

예 : var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));

웹 서버가 자동으로 동일한 작업을 수행하므로 디코딩 할 필요가 없습니다.


-8

정규 표현식을 사용하지 마십시오 (절대로 전혀 의미가 없음). 가장 효과적인 방법 :

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;
};

"정규 표현식을 사용하지 마십시오 (절대로 전혀 의미가 없음)". 모든 도구는 그 목적에 부합합니다.
zstate

당신의 대답은 유효합니다, 당신은 방금 후배들에게 혼동을 줄 수있는, 매우 의견이 많은 방법으로 표현했습니다.
zstate

@oncode 정규 표현식은 언제 어떻게 사용하든 놀라운 쓸모가 없습니다. 정의되지 않은 동작과 CPU 시간 낭비로 이어집니다.
Alek Depler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.