배열이 최상위 JSON 텍스트 일 ​​수 있습니까?


답변:


126

예, 배열은 최상위 JSON 텍스트로 합법적입니다.

JSON을 정의하는 세 가지 표준 문서는 RFC 4627 , RFC 7159 (RFC 4627 폐기 됨) 및 ECMA-404 입니다. 허용하는 최상위 요소가 다르지만 모두 최상위 요소로 객체 또는 배열을 허용합니다.

  • RFC 4627 : 개체 또는 배열.
    "JSON 텍스트는 직렬화 된 객체 또는 배열입니다."
  • RFC 7159 : 모든 JSON 값.
    "JSON 텍스트는 직렬화 된 값입니다."
  • ECMA-404 : 모든 JSON 값.
    "JSON 텍스트는 JSON 값 문법을 따르는 유니 코드 코드 포인트로 구성된 일련의 토큰입니다."

2
현재 이 새로운 RFC , "A JSON 텍스트 토큰의 순서는 다음과 같습니다. 토큰 세트는 여섯 개 구조 문자, 문자열, 숫자, 3 문자 이름이 포함됩니다."
antak

63

,하지만 JSON 하이재킹 으로 인해 일부 시나리오에서 대신 루트를 객체로 만드는 것을 고려해야합니다 . 이것은 JavaScript의 배열 생성자 재정의를 기반으로 한 정보 유출 취약점입니다.


11
네, 그것은 훌륭한 답변의 특징입니다. OP에게 그들이 알고 싶었던 것을 말할뿐만 아니라 그들이 알아야 할 것 (그러나 깨닫지 못했던 것)을 말하는 것입니다. 실제로 Javascript로 구문 분석하는 JSON과 관련된 많은 취약점이 있습니다. JSON 하이재킹은 하나의 예일뿐입니다.
sleske


4

이것은 ECMAScript 사양에서 가져온 것입니다.

JSONText :
    JSONValue

JSONValue :
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
그러나 ECMAScript를 사용하면 최상위 텍스트가 아닌 JSON 문자열을 구문 분석 할 수 있기 때문에 약간 오해의 소지가 있습니다. RFC에 따르면 "JSON 텍스트는 직렬화 된 객체 또는 배열입니다."
Matthew Flaschen

@Matthew-이상합니다, Crockford가 그것에 대해 어떻게 느끼는지 궁금합니다. RFC와 ECMA의 차이점을 어떻게 조정합니까?
ChaosPandion

3
나는 방금 보았고 그들이 그 차이를 알고 있다는 것을 알았습니다. ECMAScript 5 §15.12에서 "ECMAScript JSON 문법의 최상위 JSONText 생성은 RFC 4627에 지정된대로 JSONObject 또는 JSONArray로 제한되지 않고 모든 JSONValue로 구성 될 수 있습니다." IETF가 RFC를 변경할지 모르겠습니다.
Matthew Flaschen

@Matthew-고마워, 나는 끔찍하게 혼란스러워하고 있었다. json.org 설명은 더 제한 "JSON 텍스트"의 개념을 언급하지 않는 모든에서 , 그 중요성에 대한 막연한의 RFC의 종류.
mrec

이 대답은 ECMAScript에 관한 것이지만 질문은 JSON에 관한 것입니다. (고의적으로) 비슷해 보이지만 사양다릅니다 .
sleske

2

예, 여기에서 사용해보세요.

http://www.jsonlint.com/

그리고 [{}]에 넣어


3
그것보다 훨씬 쉽습니다. 입력 []하면 유효성이 검사됩니다.
sorpigal

링크가 끊어졌습니다. 거의 링크 전용 인이 답변을 업데이트하거나 제거하십시오.
안톤

1

다른 의견에서 볼 수 있듯이 약간의 혼란이 있습니다. "application / json"미디어 유형은 JSON RFC에 따라 JSON 텍스트에 대해 최상위 수준의 객체 또는 배열 만 허용합니다 . 그러나 파서의 경우 ECMAScript 사양에서 볼 수 있듯이 모든 JSON 값이 허용됩니다.


최상위 요소 인 모든 JSON 값은 ECMAScript 파서 에는 허용 되지만 (준수) JSON 파서 에는 허용 되지 않습니다 . 중요한 차이점입니다.
sleske

그것은 흥미로운 차이점이지만 당신이 말하는 것을 이해하지 못합니다. "(준수) JSON 파서"의 정의는 무엇입니까?
cdunn2001

1
글쎄요, JSON 파서는 JSON 문법을위한 파서입니다. JSON은 자바 스크립트와 비슷해 보이지만 문법은 훨씬 더 간단합니다. JSON 문법을 설명하는 tools.ietf.org/html/rfc7159를 참조하세요 . "준수"는 파서가 실제로 문법을 따르는 것을 의미합니다 (모든 괜찮은 파서가 그래야 함).
sleske

3
RFC 4627은 오래되었습니다. 더 이상 따르지 마십시오. 새로운 RFC는 최상위 수준에서 간단한 값도 허용합니다.
Matthias Dieter Wallnöfer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.