-
JSON 규격 RFC-7159 (Proposed Standard) The JavaScript Object Notation (JSON) Data Interchange FormatLanguage/Javascript 2019. 7. 15. 14:52
요즘 JSON 관련 공부를 하다가 규격 문서를 보게 되었는데... 당연하게도 영어!!
그래서 조금 보기 쉽게 변역기들의 도움을 받아서 번역하였는데 혼자보기 아까우니 공유합니다!
원문 주소는 아래에 첨부하니 좀더 정확한 내용을 알고 싶으신 분은 링크를 따라가시면 됩니다~
https://datatracker.ietf.org/doc/rfc7159/?include_text=1
1. 소개
JSON (JavaScript Object Notation)은 구조화 된 데이터의 직렬화를위한 텍스트 형식입니다. ECMAScript 프로그래밍 언어 표준, 제 3 판 [ECMA-262]에 정의 된대로 JavaScript의 객체 리터럴에서 파생됩니다.
JSON은 네 개의 기본 유형 (문자열, 숫자, 부울 및 널) 및 두 개의 구조화 된 유형 (오브젝트 및 배열)을 나타낼 수 있습니다.
문자열은 0 개 이상의 유니 코드 문자 [UNICODE]의 시퀀스입니다. 이 인용문은 특정 릴리스가 아닌 최신 버전의 Unicode를 참조합니다. UNICODE 스펙의 향후 변경 사항이 JSON의 구문에 영향을 미칠 것으로 예상되지는 않습니다.
객체는 이름이 문자열이고 값이 문자열, 숫자, 부울, null, 객체 또는 배열 인 0 개 이상의 이름 / 값 쌍으로 이루어진 순서가 지정되지 않은 콜렉션입니다.
배열은 0 개 이상의 값으로 정렬 된 순서입니다.
"객체"및 "배열"이라는 용어는 JavaScript 규약에서 비롯된 것입니다.
JSON의 디자인 목표는 최소, 이식성, 텍스트 및 자바 스크립트의 하위 집합이었습니다.
1.1. 이 문서에 사용 된 규칙
이 문서에서 핵심 단어는 반드시 "필수", "요구하지 말아야한다", "해야한다", "하지 말아야한다", "하지 마라", "권장하지 않는다", "할 수도있다", "선택 가능하다"등이다. [RFC2119]에 설명 된대로 해석되어야한다.
이 문서의 문법적 규칙은 [RFC5234]에 설명 된대로 해석되어야한다.
1.2. JSON의 사양
이 문서는 JSON을 기술하고 media type "application / json"을 등록하는 [RFC4627]을 업데이트합니다.
ECMAScript 사양의 JSON에 대한 설명은 ECMAScript 사양 [ECMA-262], 15.12 절의 버전 5.1에 나와 있습니다. JSON은 [ECMA-404]에도 설명되어 있습니다.
JSON 구문의 모든 사양은 언어의 구문 요소에 동의합니다.
1.3. 이 개정판 소개
RFC 4627이 발표 된 이래로 JSON은 매우 광범위하게 사용되었습니다. 이 경험으로 인해 특정 패턴이 드러났는데,이 패턴은 사양에 따라 허용되지만 상호 운용성 문제를 야기했습니다.
또한 소수의 정오표가보고되었습니다 (RFC 정오표 ID 607 [Err607] 및 3607 [Err3607] 참조).
이 문서의 목표는 정오표를 적용하고 다른 JSON 사양과의 불일치를 제거하고 상호 운용성 문제를 일으킬 수있는 사례를 강조하는 것입니다.
2. JSON 문법
JSON 텍스트는 일련의 토큰입니다. 토큰 집합에는 6 개의 구조적 문자, 문자열, 숫자 및 3 개의 리터럴 이름이 포함됩니다.
JSON 텍스트는 일련 화 된 값입니다. 이전의 JSON 사양에서는 JSON 텍스트를 객체 또는 배열로 제한했습니다. JSON 텍스트가 호출되는 객체 또는 배열 만 생성하는 구현은 모든 구현에서 JSON 텍스트를 준수하는 것으로 간주한다는 점에서 상호 운용 가능할 것입니다.
JSON-text = ws value ws
These are the six structural characters:
begin-array = ws %x5B ws ; [ left square bracket
begin-object = ws %x7B ws ; { left curly bracket
end-array = ws %x5D ws ; ] right square bracket
end-object = ws %x7D ws ; } right curly bracket
name-separator = ws %x3A ws ; : colon
value-separator = ws %x2C ws ; , comma무의미한 공백 문자는 6 개의 구조 문자 앞이나 뒤에 입력 할 수 있습니다.
ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ) ; Carriage return3. Values
JSON 값은 객체, 배열, 숫자 또는 문자열이거나 다음의 세 가지 리터럴 이름 중 하나 여야합니다.
false null true
리터럴 이름은 반드시 소문자 여야합니다. 다른 리터럴 이름은 허용되지 않습니다.
value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true4. Objects
객체 구조는 0 개 이상의 이름 / 값 쌍 (또는 멤버)을 둘러싸는 한 쌍의 중괄호로 표현됩니다. 이름은 문자열입니다. 하나의 콜론이 각 이름 다음에오고 값과 이름이 구분됩니다. 단일 쉼표는 다음 이름과 값을 구분합니다. 객체 내의 이름은 고유해야합니다 (SHOULD).
object = begin-object [ member *( value-separator member ) ]
end-object
member = string name-separator value이름이 모두 고유한 개체는 그 개체를받는 모든 소프트웨어 구현이 이름과 값의 매핑에 동의한다는 의미에서 상호 운용 가능합니다. 개체의 이름이 고유하지 않은 경우 이러한 개체를받는 소프트웨어의 동작은 예측할 수 없습니다. 많은 구현 성 및 값 쌍만을보고합니다. 다른 구현에서 오류를보고하거나 개체 구문 분석에 실패하거나 일부 구현에서는 중복을 포함한 모든 이름과 값의 쌍을보고합니다.
JSON 구문 분석 라이브러리는 호출하는 소프트웨어에서 객체 멤버의 순서를 볼 수 있는지 여부에 따라 다릅니다. 멤버의 순서에 의존하지 않는 구현은 이러한 차이의 영향을받지 않는다는 점에서 상호 운용 될 것입니다.
5. Arrays
배열 구조는 0 개 이상의 값 (또는 요소)을 둘러싸는 대괄호로 표시됩니다. 요소는 쉼표로 구분됩니다.
array = begin-array [ value *( value-separator value ) ] end-array
배열의 값이 같은 유형이어야한다는 요구 사항은 없습니다. (배열 요소의 타입이 달라도 된다.)
6. Numbers
숫자의 표현은 대부분의 프로그래밍 언어에서 사용되는 것과 유사하다. 숫자는 10진수를 사용하여 기본 10으로 표시된다. 선택적 마이너스 기호를 붙일 수 있는 정수 성분을 포함하고 있으며, 그 뒤에 부분 및/또는 지수 부분이 뒤따를 수 있다. 선행 0은 허용되지 않는다.
분수는 소수점 뒤에 하나 이상의 자릿수를 말한다.
지수 부분은 대문자 또는 소문자 E로 시작하며, 뒤에 플러스 또는 마이너스 기호가 표시될 수 있다. E와 옵션 기호는 하나 이상의 숫자로 표시된다.
아래의 문법에 나타낼 수 없는 수치(Infinity, NaN 등)는 허용되지 않는다.
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D ; -
plus = %x2B ; +
zero = %x30 ; 0이 규격은 구현이 허용된 숫자의 범위와 정밀도에 대한 제한을 설정할 수 있도록 한다. IEEE 754-2008 binary64(이중 정밀도) numbers[IEEE754]를 구현하는 소프트웨어는 일반적으로 이용 가능하고 널리 사용되기 때문에, 구현이 예상 정밀도 내에서 JSON 번호와 근사하게 될 것이라는 의미에서 이들 번호보다 더 정밀도나 범위가 없을 것으로 기대하는 구현에 의해 우수한 상호운용성을 달성할 수 있다. 1E400 또는 3.141592653589793238462643383279와 같은 JSON 번호는 수신 소프트웨어를 생성하는 소프트웨어가 널리 사용할 수 있는 것보다 더 큰 수적 크기 및 정밀도에 대한 기능을 가지고 있음을 시사하기 때문에 잠재적 상호운용성 문제를 나타낼 수 있다.
이러한 소프트웨어를 사용할 경우, [-(2**53)+1, (2*53)-1] 범위에 있는 숫자는 구현이 정확히 숫자 값에 동의한다는 의미에서 상호운용 가능하다.
7. Strings
문자열의 표현은 프로그래밍 언어의 C 계열에서 사용되는 관습과 유사하다. 문자열은 따옴표로 시작하고 끝난다. 모든 유니코드 문자는 따옴표, 역고체 및 제어 문자(U+000000 ~ U+001F)를 제외하고 따옴표 안에 배치할 수 있다.
모든 문자가 이스케이프 처리 될 수 있다. 문자가 기본 다국어 평면(U+000000 ~ U+FFFF)에 있는 경우, 역고체, 그 뒤에 소문자 u, 그 뒤에 문자의 코드 포인트를 인코딩하는 4개의 16진수 숫자로 표시될 수 있다. 16진수 문자 A 단 F는 대문자 또는 소문자일 수 있다. 따라서, 예를 들어, 하나의 역고체(reverse solidus character) 문자만 포함하는 문자열은 "\u005C"로 나타낼 수 있다.
또는 인기있는 문자의 두 문자 시퀀스 이스케이프 표현이 있다. 따라서, 예를 들어, 하나의 역고체 문자만 포함하는 문자열은 "\\"로 더 간결하게 표현될 수 있다.
Basic Multilingual Plane에없는 확장 문자를 이스케이프하기 위해 문자는 UTF-16 서로 게이트 쌍을 인코딩하는 12 문자 시퀀스로 표현됩니다. 예를 들어 G 음자리표 문자 (U + 1D11E) 만 포함 된 문자열은 "\ uD834 \ uDD1E"로 표시 될 수 있습니다.
string = quotation-mark *char quotation-mark
char = unescaped /
escape (
%x22 / ; " quotation mark U+0022
%x5C / ; \ reverse solidus U+005C
%x2F / ; / solidus U+002F
%x62 / ; b backspace U+0008
%x66 / ; f form feed U+000C
%x6E / ; n line feed U+000A
%x72 / ; r carriage return U+000D
%x74 / ; t tab U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
escape = %x5C ; \
quotation-mark = %x22 ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF8. String and Character Issues
8.1. Character Encoding
JSON 텍스트는 UTF-8, UTF-16 또는 UTF-32로 인코딩되어야 한다. 기본 인코딩은 UTF-8이며, UTF-8로 인코딩된 JSON 텍스트는 최대 구현 횟수에 의해 성공적으로 읽힐 수 있다는 점에서 상호운용 가능하며, 다른 인코딩(UTF-16, UTF-32)에서 텍스트를 성공적으로 읽을 수 없는 구현이 많다.
구현은 반드시 JSON 텍스트의 시작 부분에 바이트 순서 마크를 추가해서는 안 된다. 상호운용성을 위해, JSON 텍스트를 구문 분석하는 구현은 그것을 오류로 취급하기 보다는 바이트 순서 표시의 존재를 무시할 수 있다.
8.2. Unicode Characters
JSON 텍스트에 표시된 모든 문자열이 유니코드 문자 [UNICODE](이스케이프 됨)로 완전히 구성되면, 해당 문자열을 구문 분석하는 모든 소프트웨어 구현이 객체 및 배열의 문자열 값과 이름 내용에 합의한다는 점에서 상호운용 가능하다.
그러나 이 규격의 ABNF는 유니코드 문자를 인코딩할 수 없는 비트 시퀀스(예: "\uDEAD"(페어링되지 않은 단일 UTF-16 대리(surrogate))를 멤버 이름과 문자열 값에 포함할 수 있도록 허용한다. 예를 들어, 라이브러리가 UTF-16 문자열을 절단할 때 해당 자르기에서 대리 쌍이 분할되는지 여부를 확인하지 않은 경우가 관찰되었다. 예를 들어, 구현은 문자열 값의 길이에 대해 다른 값을 반환하거나 치명적인 런타임 예외를 겪을 수 있다.
8.3. String Comparison
일반적으로 소프트웨어 구현은 객체 멤버의 이름을 평등하게 테스트해야합니다. 텍스트 표현을 유니 코드 코드 단위로 변환 한 다음 코드 단위로 코드 단위를 비교하는 구현은 두 문자열의 평등 또는 불평등에 대한 모든 경우에 구현이 일치한다는 의미에서 상호 운용 가능합니다. 예를 들어, 변환되지 않은 이스케이프 된 문자와 문자열을 비교하는 구현에서는 "a \\ b"및 "a \ u005Cb"가 동일하지 않은 것으로 잘못 인식 할 수 있습니다.
9. Parsers
JSON 파서는 JSON 텍스트를 다른 표현으로 변환한다. JSON 파서는 반드시 JSON 문법에 맞는 모든 텍스트를 받아들여야 한다. JSON 파서는 비 JSON 양식 또는 확장을 수락할 수 있다.
구현은 받아들이는 텍스트의 크기에 제한을 설정할 수 있습니다. 구현은 최대 중첩 깊이에 대한 제한을 설정할 수 있습니다. 구현은 숫자의 범위와 정밀도에 제한을 설정할 수 있습니다. 구현은 문자열의 길이와 문자 내용에 제한을 설정할 수 있습니다.
10. Generators
JSON 생성기는 JSON 텍스트를 생성합니다. 결과 텍스트는 JSON 문법을 엄격하게 준수해야합니다.
11. IANA 고려 사항
IANA는 인터넷 소사이어티(ISOC)의 산하기관으로, 인터넷에 접속하기 위한 인터넷 프로토콜(IP)의 전 세계적 주소에 대하여 최종적인 조정과 관리를 하는 기관.
JSON 텍스트의 MIME 미디어 유형은 application / json입니다.
유형 이름 : application
하위 유형 이름 : json
필수 매개 변수 : 해당 사항 없음
선택적 매개 변수 : 해당 사항 없음
인코딩 고려 사항 : binary
보안 고려 사항 : [RFC7159], 12 절 참조.
상호 운용성 고려 사항 : [RFC7159]
게시 된 사양 : [RFC7159]
이 미디어 유형을 사용하는 응용 프로그램 :
JSON은 다음과 같은 프로그래밍 언어로 작성된 애플리케이션 간에 데이터를 교환하는 데 사용되어 왔다. ActionScript, C, C#, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala, Scheme.
12. 보안 고려 사항
일반적으로 스크립팅 언어에는 보안 문제가 있다. JSON은 자바스크립트의 하위 집합이지만 할당과 호출은 제외한다.
JSON 구문은 JavaScript에서 빌려 왔기 때문에 해당 언어의 "eval ()"함수를 사용하여 JSON 텍스트를 구문 분석 할 수 있습니다. 텍스트는 데이터 선언과 함께 실행 코드를 포함 할 수 있기 때문에 일반적으로 허용되지 않는 보안 위험을 초래합니다. JSON 텍스트가 해당 언어의 구문을 따르는 다른 프로그래밍 언어에서 eval ()과 유사한 함수를 사용하는 경우에도 동일한 고려 사항이 적용됩니다.
13. Examples
This is a JSON object:
{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": 100 }, "Animated" : false, "IDs": [116, 943, 234, 38793] } }
This is a JSON array containing two objects:
[ { "precision": "zip", "Latitude": 37.7668, "Longitude": -122.3959, "Address": "", "City": "SAN FRANCISCO", "State": "CA", "Zip": "94107", "Country": "US" }, { "precision": "zip", "Latitude": 37.371991, "Longitude": -122.026020, "Address": "", "City": "SUNNYVALE", "State": "CA", "Zip": "94085", "Country": "US" } ]
'Language > Javascript' 카테고리의 다른 글
[ECMA Script6] 6. 모듈 과 CommonJS (0) 2020.01.04 [ECMA Script6] 5. 클래스 (0) 2019.12.21 [ECMA Script6] 4. 스프레드 연산자 (0) 2019.12.14 [ECMA Script6] 3. ES6객체와 배열 (0) 2019.12.07 [ECMA Script6] 2. 화살표 함수(arow function) 및 트랜스파일링 (0) 2019.11.30 댓글