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


200

여기 내 줄이있다

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

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


45
JSON은 참조 만 따옴표가 아닌 단일 인용 부호를 사용 json.org
닐스 그랬지

4
RFC 4627에 따르면 파서는 해당 JSON을 구문 분석 할 수 있어야하며 (문단 4) 추가 비 JSON 확장을 지원할 수 있습니다. 그러나 5 항에서는 모든 생산자 (생성자)가 반드시 100 % 호환 JSON 만 생성해야한다고 강조합니다. 이스케이프 할 필요가없는 프레임 문자로 JSON을 생성하는 것은 특히 나쁜 생각입니다. 아포스트로피를 따옴표로 바꾸십시오. ietf.org/rfc/rfc4627.txt
Luv2code

3
@ Luv2code 당신이 만드는 요점이 사실이지만, 당신은 쓸모없는 사양을 인용하고 있습니다. RFC를 읽을 때는 항상 텍스트 버전이 아닌 tools.ietf.org/html 버전을 사용하십시오 . HTML 버전은 읽기 쉽고 하위 섹션에 연결되며, 가장 중요한 것은 HTML 버전의 맨 위에는 읽고있는 내용을 업데이트하거나 사용하지 않는 모든 후속 RFC 목록이 있습니다. 당신이 사라했다면 tools.ietf.org/html/rfc4627 당신은 RFC 4627는 현재 무효이며,로 대체 된 것을 본 것 RFC 7159 .
Mark Amery

3
앞으로 이것을 읽는 사람들에게 RFC 7159는 tools.ietf.org/html/rfc8259에
Joram van den Boezem

답변:


286

사양 에 따라 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 문자열에 큰 따옴표를 사용하십시오.


30
"단일 인용 된 JSON 문자열" ? 이것은 말도 안됩니다. JSON의 문자열은 큰 따옴표 만 사용할 수 있습니다. JSON.parse("'foo'")예를 들어 브라우저 콘솔에서 시도 하고을 관찰하십시오 SyntaxError: Unexpected token '. JSON 사양은 실제로 간단하고 명확 합니다. 작은 따옴표에 대해서는 JSON에 이스케이프 시퀀스가 ​​없으며 JSON 문자열은 작은 따옴표로 묶을 수 없습니다.
Mark Amery

15
아마도이 대답에 대한 명확한 업데이트조차도 나쁩니다. 기술적으로는 사실이지만, 탈출하는 데 "필요하지 않다"' 고 말하는 것은 오해의 소지가 있습니다. 기술적으로는 사실이지만 아이를 살해 할 필요는 없다고 말하는 것은 오도합니다 . 더 정확한 것은 탈출 할 수 없다고 말하는 것입니다 '. \'는 잘못된 이스케이프 시퀀스이며 사용하면 JSON이 유효한 JSON아니며 JSON 파서가 질식합니다. (확실히 JavaScript JSON.parse와 Python의 json.loads일입니다.)
Mark Amery

2
이 답변은 많은 편집 후에도 여전히 넌센스입니다. JSON에서 작은 따옴표로 묶은 문자열을 사용하고 \'이스케이프 시퀀스를 사용하면 "원하는대로 작동" 한다고 잘못 주장 합니다. 이것은 거짓입니다. 난 당신이 전시에 도전 어떤 단일 인용 문자열 또는 질식하지 않습니다 인기있는 사용 JSON 파서 \'순서를. 나는 이미 지적 JSON.parse("'foo'")JSON.parse('"\\\'"') 와 (자바 스크립트) json.loads("'foo'")json.loads('"\\\'"')모두 던져 예외 (파이썬). 이 구성을 사용하는 것이 "작동"한다는 주장 의 근거는 무엇입니까 ?
Mark Amery 14시 08 분

10
@ Luv2code 재미있는 인용문. 약간 잘못 해석하고 있습니다. 그것은 하지 않는 모든 문자는 앞에 백 슬래시를 넣어 간단하게 탈출 할 수 있다는 것을 의미한다. 더 큰 인용문은 "모든 문자가 이스케이프 될 수 있습니다. 문자가 기본 다국어 평면 (U + 0000-U + FFFF)에있는 경우 6 자 시퀀스 로 표시 될 수 있습니다 . ... 또는 두 가지가 있습니다 - 일부 인기 문자의 문자 시퀀스 이스케이프 표현 . "(강조 광산). 당신이 탈출 할 수 말하는 '대로 \u0027, 아니 당신이로 탈출 할 수 있다고 \'.
Mark Amery

2
@ Luv2code는 여전히 "당신은 탈출 할 수 없다 '"(그리고 그러한 행동을 아이들의 살인과 비교하는 것!)라는 기술적 인 의견 이 기술적으로 잘못되었다는 것을 의미합니다. 더 정확한 것은 당신이 아니라 그것을 벗어날 수 있다고 말하는 것입니다 \'. 사양의 RFC 버전이 \u0027나타내는 문자를 '이스케이프'하는 방법 과 같은 시퀀스를 참조한다는 것을 알지 못했습니다 . 그러나 \'불법적 인 요점 은 여전히 ​​사실이며 중요합니다.
Mark Amery

362

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

작은 따옴표로 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의 이스케이프 규칙을 알 필요조차 없습니다. 이것이 잘못된 질문으로 여기에서해야 할 일입니다.


4 진수 바이트 또는 니블 ?
leetbacoon

36

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

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


1
안녕, 당신은 큰 따옴표로 문자열을 말했다, 당신은 탈출 할 필요가 없습니다 '. 내 문자열 값이 "Member's_id" : 4인 경우 탈출 할 필요가 없다고 말하는가? 분명히 잘못된 인코딩 오류가 발생하는 문제가 있습니다 : UTF-8 및로 읽습니다 Member�s. 수동으로 생성 된 json 파일입니다.
Shubham

1
'JSON 문자열 리터럴에서 이스케이프하면 안됩니다. 어딘가에서 복사하여 붙여 넣었습니까? 어쩌면 \u2019아포스트로피가 아닌 실제로 일 수도 있습니다 . 내 추측 : 누군가가 MS Word에 입력하면 가장 잘 알고 있다고 생각하기 때문에 따옴표로 바꿨습니다. 문법적으로, 좋은 ASCII 문자 아포스트로피 ( ', 일명 \x27우리가 지금까지 "작은 따옴표"라고 불렀음)가 원하는 것입니다. 그러나 다른 유사한 문제가있는 경우 문자 인코딩 문제를 해결하는 것이 좋습니다. 따라서 문자 인코딩을 선택하여 읽기와 쓰기에 모두 사용하십시오. 또는를 사용하여 탈출하십시오 \u.
David Knipe

7

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

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에 의해 제안되었습니다.

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


0

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

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

0

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

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

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

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


참조에 대해서는 -1입니다. 문제는 JSON에 관한 것이지만 연결된 참조는 JavaScript에 관한 것이며 JavaScript와 같이 JavaScript에서 유효하지 않은 이스케이프 시퀀스를 나열합니다 \'.
Mark Amery

고마워 마크-나는 단지 다른 각도를주고 싶었습니다. 여기에 도착하는 사람에 따라 이것이 유용하다는 것을 알 수 있습니다. 그러나 나는 JSON & Javascript에 대해 당신의 요점을 취합니다-포럼에서 Ninja가되어 주셔서 감사합니다.
Luigi D' Amico

0

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

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

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


0

템플릿 리터럴 사용 ...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;

-2

우리 모두는 작은 따옴표로 묶인 json이 실제 json이 아니라고 동의합니다. 우리가 할 수있는 라이브러리가없는 경우에도 큰 따옴표로 묶인 json 문자열 내에서 "이스케이프 처리 문제를 해결해야합니다.

각 "를 \"로 바꾸는 것은 충분하지 않습니다. 사용자가 입력을 입력 할 수 있습니다 : \ 및 구문 분석이 다시 실패합니다 (이유를 생각하십시오).

대신, 먼저 각 \를 \ (이중 백 슬래시)로 바꾸십시오. 그런 다음에 만 각 "를 \"(백 슬래시 다음에 ")로 바꾸십시오.


-2

json의 목적으로 이중 인용 문자열 내에서 작은 따옴표를 허용하려면 작은 따옴표를 두 배로하십시오. { "X": "질문이 무엇입니까"} ==> { "X": "질문이 무엇입니까"}

/codereview/69266/json-conversion-to-single-quotes

\ '시퀀스가 유효하지 않습니다.


2
JSON 문자열에서 작은 따옴표를 두 배로 늘려도 이스케이프되지 않습니다. 그것은 문자열에 하나가 아닌 두 개의 작은 따옴표가 포함되어 있음을 의미합니다.
Mark Amery

-15

AlexB의 게시물과 관련하여 :

 \'  Apostrophe or single quote
 \"  Double quote

작은 따옴표를 이스케이프하면 작은 따옴표로 묶인 json 문자열
에서만 유효합니다. 큰 따옴표를 이스케이프하면 큰 따옴표로 묶인 json 문자열에서만 유효합니다.

예:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid

14
작은 따옴표로 묶인 문자열은 JSON에서 유효하지 않습니다. JSON은 자바 스크립트가 아닙니다. JSON은 작은 따옴표를 이스케이프 처리 할 수 ​​없습니다. JSON 구문에 대한 매우 간단한 문서는 json.org 를 참조하십시오 .
srm

3
downvote-작은 따옴표 json이 유효하지 않기 때문에!
DominikAngerer

작은 따옴표는 json에서 유효하지 않습니다. 이것이 가능하다면 작동하는 샘플을 보여주십시오
Rohith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.