Programing

유효한 최소 JSON은 무엇입니까?

crosscheck 2020. 6. 9. 08:08
반응형

유효한 최소 JSON은 무엇입니까?


JSON 설명 http://json.org/을 주의 깊게 읽었 지만 간단한 질문에 대한 답을 모르겠습니다. 유효한 최소 JSON은 무엇입니까?

  • "string" 문자열이 유효한 JSON입니까?
  • 42 간단한 숫자가 유효한 JSON입니까?
  • true 부울 값이 유효한 JSON입니까?
  • {} 빈 객체가 유효한 JSON입니까?
  • [] 빈 배열이 유효한 JSON입니까?

작성 당시 JSON은 RFC4627 에만 설명되어 있습니다 . JSON 텍스트를 직렬화 된 객체 또는 배열로 설명합니다 ( "2"시작 부분).

이 방법 만을 {}[]파서 그 표준을 준수 stringifiers에서 유효, 전체 JSON 문자열입니다.

그러나 ECMA-404의 도입으로 변경되었으며 업데이트 된 조언 은 여기에서 읽을 수 있습니다 . 또한 이 문제에 대한 블로그 게시물작성했습니다 .


그러나 문제를 더 혼란스럽게하기 위해 웹 브라우저에서 사용할 수 있는 JSON객체 (예 : JSON.parse()JSON.stringify()) 가 ES5 에서 표준화되어 수용 가능한 JSON 텍스트를 다음과 같이 명확하게 정의합니다.

이 사양에 사용 된 JSON 교환 형식은 RFC 4627에 설명 된 형식과 정확히 일치하며 다음 두 가지 예외가 있습니다.

  • ECMAScript JSON 문법의 최상위 JSONText 생성은 RFC 4627에 지정된 JSONObject 또는 JSONArray로 제한되지 않고 모든 JSONValue로 구성 될 수 있습니다.

  • 도청

이는 JSON 객체가 기술적으로 RFC 4627을 준수하더라도 모든 JSON 값 (문자열, null 및 숫자 포함)이 JSON 객체에 의해 수락됨을 의미합니다.

따라서 JSON.stringify(5)RFC4627을 준수하지만 위에 나열된 특정 예외는없는 다른 파서에서 거부되는을 통해 준수 브라우저에서 숫자 를 문자열화할 수 있습니다. 예를 들어, Ruby 는 객체와 배열 root로 받아들이는 하나의 예인 것 같습니다 . 반면에 PHP 는 특히 "스칼라 형식과 NULL도 인코딩 및 디코딩합니다" 라는 예외추가합니다 .


인터넷에서 JSON 표준으로 간주 될 수있는 문서가 4 개 이상 있습니다. 참조 된 RFC는 모두 MIME 유형을 설명합니다 application/json. 다음은 최상위 값과 객체 또는 배열 이외의 항목이 최상위에 허용되는지 여부에 대한 설명입니다.

RFC-4627 : 아니오

JSON 텍스트는 일련의 토큰입니다. 토큰 세트에는 6 개의 구조 문자, 문자열, 숫자 및 3 개의 리터럴 이름이 포함됩니다.

JSON 텍스트는 직렬화 된 객체 또는 배열입니다.

JSON 텍스트 = 객체 / 배열

RFC-4627은 "제안 된 표준"과 반대로 "정보"로 표시되었으며, RFC-7159에 의해 폐기되었으며, RFC-7159 는 RFC-8259에 의해 폐기되었습니다.

RFC-8259 : 예.

JSON 텍스트는 일련의 토큰입니다. 토큰 세트에는 6 개의 구조 문자, 문자열, 숫자 및 3 개의 리터럴 이름이 포함됩니다.

JSON 텍스트는 직렬화 된 값입니다. JSON의 특정 이전 사양은 JSON 텍스트를 객체 또는 배열로 제한했습니다. JSON 텍스트가 호출되는 객체 또는 배열 만 생성하는 구현은 모든 구현에서이를 일치하는 JSON 텍스트로 허용한다는 의미에서 상호 운용 가능합니다.

JSON 텍스트 = WS 값 WS

RFC-8259는 2017 년 12 월 날짜이며 "인터넷 표준"으로 표시되어 있습니다.

ECMA-262 : 예.

JSON 구문 문법은 JSON 어휘 문법에 의해 정의 된 토큰의 관점에서 유효한 JSON 텍스트를 정의합니다. 문법의 목표 기호는 JSONText입니다.

구문 JSONText :

JSONValue

JSONValue :

JSONNullLiteral

JSONBooleanLiteral

JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404 : 예.

JSON 텍스트는 JSON 값 문법을 따르는 유니 코드 코드 포인트로 구성된 일련의 토큰입니다. 토큰 세트에는 6 개의 구조 토큰, 문자열, 숫자 및 3 개의 리터럴 이름 토큰이 포함됩니다.


RFC 4627 (RFC 7159에 의해 2014 년 3 월 폐기 됨)의 이전 정의에 따르면 , 이들은 모두 유효한 "JSON 값"이지만 마지막 두 개만이 완전한 "JSON 텍스트"를 구성합니다.

JSON 텍스트는 직렬화 된 객체 또는 배열입니다.

사용 된 구문 분석기에 따라 고독한 "JSON 값"이 허용 될 수 있습니다. 예를 들어 "JSON 값"대 "JSON 텍스트"용어를 고수합니다.

  • JSON.parse()지금은 최신 브라우저에서 표준화 기능은 "JSON 값을"받아
  • PHP 함수 json_decode는 전체 "JSON 텍스트"만 허용하는 버전 5.2.0에서 도입되었지만 버전 5.2.1에서 "JSON 값"을 허용하도록 수정되었습니다.
  • 파이썬 json.loads이 매뉴얼 페이지의 예제 따라 "JSON 값"을 받아들입니다 .
  • http://jsonlint.com 의 유효성 검사기는 "JSON 텍스트"가 필요합니다.
  • Ruby JSON 모듈은 전체 "JSON 텍스트"만 수락합니다 (적어도이 매뉴얼 페이지 의 설명 따라 ).

The distinction is a bit like the distinction between an "XML document" and an "XML fragment", although technically <foo /> is a well-formed XML document (it would be better written as <?xml version="1.0" ?><foo />, but as pointed out in comments, the <?xml declaration is technically optional).


JSON stands for JavaScript Object Notation. Only {} and [] define a Javascript object. The other examples are value literals. There are object types in Javascript for working with those values, but the expression "string" is a source code representation of a literal value and not an object.

Keep in mind that JSON is not Javascript. It is a notation that represents data. It has a very simple and limited structure. JSON data is structured using {},:[] characters. You can only use literal values inside that structure.

It is perfectly valid for a server to respond with either an object description or a literal value. All JSON parsers should be handle to handle just a literal value, but only one value. JSON can only represent a single object at a time. So for a server to return more than one value it would have to structure it as an object or an array.


The ecma specification might be useful for reference:

http://www.ecma-international.org/ecma-262/5.1/

The parse function parses a JSON text (a JSON-formatted String) and produces an ECMAScript value. The JSON format is a restricted form of ECMAScript literal. JSON objects are realized as ECMAScript objects. JSON arrays are realized as ECMAScript arrays. JSON strings, numbers, booleans, and null are realized as ECMAScript Strings, Numbers, Booleans, and null. JSON uses a more limited set of white space characters than WhiteSpace and allows Unicode code points U+2028 and U+2029 to directly appear in JSONString literals without using an escape sequence. The process of parsing is similar to 11.1.4 and 11.1.5 as constrained by the JSON grammar.

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []

Yes, yes, yes, yes, and yes. All of them are valid JSON value literals.

However, the official RFC 4627 states:

A JSON text is a serialized object or array.

So a whole "file" should consist of an object or array as the outermost structure, which of course can be empty. Yet, many JSON parsers accept primitive values as well for input.


var x;
JSON.stringify(x); // will output "{}"

So your answer is "{}" which denotes an empty object.


Just follow the railroad diagrams given on the json.org page. [] and {} are the minimum possible valid JSON objects. So the answer is [] and {}.

참고URL : https://stackoverflow.com/questions/18419428/what-is-the-minimum-valid-json

반응형