[json] JSON 문자열을 만들 때 특수 문자를 이스케이프 처리하는 방법은 무엇입니까?

여기 내 줄이있다

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

여기 메시지에는 작은 따옴표가 포함되어 있는데, 이는 JSON에서 사용되는 인용 부호와 동일합니다. 내가하는 일은 메시지와 같은 사용자 입력에서 문자열을 채우는 것입니다. 따라서 코드를 손상시키는 특수 시나리오를 피해야합니다. 그러나 문자열 바꾸기 이외의 방법으로 HTML을 올바른 메시지로 다시 처리 할 수 ​​있습니까?



답변

사양 에 따라 JSON 문자열을 큰 따옴표로 묶어야 하므로 이스케이프 할 필요가 없습니다 '.
JSON 문자열에 특수 문자를 사용해야하는 경우 문자를 사용하여 특수 문자를 이스케이프 처리 할 수 ​​있습니다 \.

JSON에서 사용되는 다음 특수 문자 목록을 참조하십시오.

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character

그러나 사양과 완전히 반대되는 경우에도 작성자는을 사용할 수 있습니다 \'.

이것은 나쁘기 때문에 :

  • 사양에 위배됩니다
  • 더 이상 JSON 유효하지 않은 문자열입니다.

그러나 원하는대로 작동합니다.

새로운 독자의 경우 항상 json 문자열에 큰 따옴표를 사용하십시오.


답변

나는 기본 주제에 대한 그러한 높은 시각의 질문에 대해 고도로 반박 된 잘못된 정보가 존재한다는 사실에 놀랐습니다.

작은 따옴표로 JSON 문자열 을 인용 할 수 없습니다 . 스펙의 다양한 버전 ( 더글러스 크록 포드 의 원본 , ECMA 버전IETF 버전 )에는 모두 문자열을 큰 따옴표로 묶어야한다고 명시되어 있습니다. 이것은 받아 들여진 대답이 현재 제시하고있는 이론적 인 문제 나 의견의 문제가 아니다. 작은 따옴표로 묶인 문자열을 구문 분석하려고하면 실제 세계의 모든 JSON 파서가 오류가 발생합니다.

Crockford와 ECMA의 버전은 예쁜 그림을 사용하여 문자열의 정의를 표시하기 때문에 요점을 명확하게 알 수 있습니다.

JSON 사양에서 문자열의 정의를 보여주는 이미지

예쁜 그림에는 JSON 문자열 내의 모든 합법적 인 이스케이프 시퀀스도 나열되어 있습니다.

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 뒤에 4 자리 숫자가옵니다

여기의 다른 답변에서 넌센스와 달리 \'JSON 문자열에서 유효한 이스케이프 시퀀스는 결코 아닙니다. JSON 문자열은 항상 큰 따옴표로 묶기 때문에 필요하지 않습니다.

마지막으로 프로그래밍 방식으로 JSON을 생성 할 때 문자를 이스케이프 처리 할 필요가 없습니다 (물론 JSON 기반 구성 파일을 수동으로 편집 할 때도 마찬가지입니다). 대신 언어에있는 기본 맵, 배열, 문자열, 숫자, 부울 및 널 유형을 사용하여 인코딩하려는 데이터 구조를 구성한 다음 JSON 인코딩 함수를 사용하여 JSON으로 인코딩하십시오. 이러한 함수는 JavaScript JSON.stringify, PHP json_encode또는 Python 과 같이 사용중인 언어에 내장되어있을 수 있습니다.json.dumps. 이러한 기능이 내장되지 않은 언어를 사용하는 경우 사용할 JSON 구문 분석 및 인코딩 라이브러리를 찾을 수 있습니다. 언어 또는 라이브러리 함수를 사용하여 물건을 JSON으로 변환하거나 JSON에서 변환하는 경우 JSON의 이스케이프 규칙을 알 필요조차 없습니다. 이것이 잘못된 질문으로 여기에서해야 할 일입니다.


답변

모두가 탈출하는 방법에 대해 얘기 'A의 '-quoted 문자열 리터럴. 여기에는 훨씬 큰 문제가 있습니다. 작은 따옴표로 묶인 문자열 리터럴은 유효한 JSON이 아닙니다 . JSON은 JavaScript를 기반으로하지만 동일하지 않습니다. JavaScript 코드 내에 객체 리터럴을 작성하는 경우 좋습니다. 실제로 JSON이 필요한 경우을 사용해야 "합니다.

큰 따옴표로 묶인 문자열을 사용하면을 이스케이프 처리 할 필요가 없습니다 '. (그리고 "문자열에 리터럴 을 원한다면을 사용하십시오 \".)


답변

이러한 답변의 대부분은 질문에 답변하지 않거나 설명에 불필요하게 길다.

JSON은 큰 따옴표 만 사용합니다.

JQuery AJAX를 사용하여 JSON 데이터를 서버에 게시 한 다음 나중에 동일한 정보를 반환하려고했습니다. 내가 찾은 게시 된 질문에 대한 가장 좋은 해결책은 다음을 사용하는 것입니다.

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

이것은 당신을 위해 문자를 탈출합니다.

이것은 또한 Mark Amery, Great answer BTW에 의해 제안되었습니다.

이것이 누군가를 돕기를 바랍니다.


답변

내가 파티에 너무 늦었을지도 모르지만 이것은 작은 따옴표를 파싱 / 탈출 할 것입니다 (파싱 대 탈출에 대한 전투에 가고 싶지 않음).

JSON.parse("\"'\"")


답변

직접 질문에 대한 답변 :
안전을 위해 필요한 문자를 \ u + 4 자리 16 진 값으로 바꾸십시오.

예 : 아포스트로피를 이스케이프하려면 ‘\ u0027로 대체하십시오.
D’ Amico는 D \ u0027Amico가됩니다.

좋은 참조 :
http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes


답변

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

예 : var product_list = encodeURIComponent (JSON.stringify (product_list));

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