맨위로가기

JSON

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

JSON은 텍스트 기반의 데이터 교환 형식으로, 더글러스 크록포드가 처음 정의하고 보급했다. 2001년 스테이트 소프트웨어에서 시작되었으며, 웹 브라우저 플러그인 없이 서버와 브라우저 간의 통신을 위해 개발되었다. JSON은 객체, 배열, 문자열, 숫자, 불리언, null 등의 자료형을 사용하며, 2006년 RFC 4627로 처음 표준화된 후 ECMA-404, RFC 8259, ISO/IEC 21778:2017 등 다양한 표준으로 제정되었다. JSON은 사람과 기계가 읽고 쓰기 쉬우며, 프로그래밍 언어와 플랫폼에 독립적이라는 장점이 있어 널리 활용된다. JSONPath는 JSON 문서의 특정 부분을 질의하기 위한 표현식이며, JSON5, JSONC, YAML 등 JSON의 상위 집합 및 관련 형식들이 존재한다. 보안 문제로 인해 JSON 텍스트를 `eval()` 함수로 처리하는 것은 위험할 수 있으며, `JSON.parse()` 함수를 사용하는 것이 권장된다.

더 읽어볼만한 페이지

  • JSON - JSON 웹 토큰
    JSON 웹 토큰(JWT)은 헤더, 페이로드, 서명으로 구성되어 정보를 안전하게 전송하는 개방형 표준으로, 사용자 인증 및 권한 부여에 주로 사용되지만 알고리즘 관련 취약점, 키 관리, 토큰 무효화 등의 문제점도 존재한다.
  • JSON - JSON-LD
    JSON-LD는 JSON 데이터를 RDF 모델로 표현하는 직렬화 방법으로, 컨텍스트를 활용해 JSON 속성을 온톨로지 개념에 연결하며 SEO, 의료 정보학, IoT 등 다양한 분야에서 활용되고 Schema.org, 구글 지식 그래프 등에서 중요한 역할을 한다.
  • 2001년 도입 - 게임보이 어드밴스
    게임보이 어드밴스는 닌텐도에서 출시한 휴대용 게임기로 슈퍼 패미컴을 능가하는 성능과 게임보이 시리즈와의 하위 호환성을 제공하며, 전 세계적으로 많은 판매고를 올린 인기 기종이다.
  • 2001년 도입 - 닌텐도 게임큐브
    닌텐도 게임큐브는 닌텐도가 2001년에 출시한 가정용 게임기로, 닌텐도 자사 게임기로는 처음으로 광 디스크를 채용하여 DVD 기반의 8cm 디스크를 사용하며 IBM, ATI 등과 협력 개발, 200만대 이상 판매 후 Wii로 후속 기종이 출시되었다.
  • 데이터 직렬화 포맷 - XML
    XML은 태그 중첩 방식 구문을 사용하는 범용 언어로서, 인터넷을 통한 구조화된 문서 및 데이터 공유를 용이하게 하고, 웰 폼 및 유효 XML 문서 개념을 통해 구문 정확성을 검사하며, 데이터 교환 등 다양한 분야에서 널리 사용된다.
  • 데이터 직렬화 포맷 - S-표현식
    S-표현식은 Lisp 구문에서 소스 코드와 데이터를 표현하는 기본 구조로, 원자와 `(x . y)` 형태의 표현식으로 정의되며, 이진 트리 표현, 다양한 데이터 형식 지원, 그리고 여러 분야에서 활용된다.
JSON - [IT 관련 정보]에 관한 문서
개요
JSON 로고는 뫼비우스의 띠이다
JSON 로고는 뫼비우스의 띠이다
종류데이터 교환
확장자.json
MIME 형식application/json
기반JavaScript
표준https://tools.ietf.org/html/std90 (8259)
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
https://www.iso.org/standard/71616.html
개방 여부
웹사이트https://json.org/
명칭
영어JavaScript Object Notation (자바스크립트 객체 표기법)
기술
설명사람이 읽고 쓰기 쉽고, 기계가 파싱(parsing)하고 생성하기도 쉬운 텍스트 기반의 데이터 교환 표준이다.
유니폼 타입public.json

2. 역사

JSON은 2000년대 초, 플래시자바 애플릿 같은 브라우저 플러그인 없이 실시간 서버-브라우저 통신을 위한 요구에서 성장했다.[98] 더글라스 크록포드가 처음으로 JSON 포맷을 정의하고 보급하였다.[99]

2005년 12월, 야후!는 자사 웹 서비스에 JSON을 도입하기 시작했다.[104] JSON은 자바스크립트 스크립트 언어의 서브셋(표준 ECMA-262 제3판—1999년 12월[105])에 기반을 두었지만, 언어 독립적인 데이터 포맷이다.

JSON의 사양은 2006년 7월에 로 처음 규정되었으며, 이후 여러 차례 개정되어 2017년 IETF STD 90 및 ECMA-404 2nd edition이 발표되었다.[78]

IETF, ECMA, ISO의 JSON 사양 개정 연혁은 다음과 같다:

연도내용
2006년 7월
2013년 3월
2013년 10월[http://www.ecma-international.org/publications/standards/Ecma-404-arch.htm ECMA-404 1st edition]
2014년 3월
2017년 11월 30일[https://www.iso.org/standard/71616.html ISO/IEC 21778:2017]
2017년 12월 14일[78]및 [https://tools.ietf.org/html/std90 IETF STD 90] 및 [https://www.ecma-international.org/publications-and-standards/standards/ecma-404/ ECMA-404 2nd edition]


2. 1. JSON의 발견

더글라스 크록포드는 JSON 포맷을 처음으로 정의하고 보급하였다.[99] 2001년 3월, 크록포드 등은 스테이트 소프트웨어(State Software)라는 기업을 공동 설립하였다. 이들은 표준 브라우저 기능을 사용하는 시스템을 구축하기로 합의하였고, 웹 개발자들이 상태를 인지하는(stateful) 웹 애플리케이션을 개발할 수 있도록 추상화 계층을 제공하였다. 이 시스템은 두 개의 하이퍼텍스트 전송 프로토콜(HTTP) 연결을 열어두고, 추가 데이터 교환이 없으면 표준 브라우저 타임아웃 전에 재활용하여 웹 서버와의 영속적인 반이중 통신을 지원했다. 공동 설립자들은 원탁 회의에서 데이터 포맷을 JSML로 할지, JSON으로 할지 투표하고, 라이선스 형태도 논의하였다.[100][101]

JSON 라이브러리의 전신은 카툰 네트워크의 Communities.com에서 아동용 디지털 자산 트레이딩 게임 프로젝트에 사용되었으며, DHTML 요소(3DO 소유)를 조작하기 위한 사유 메시지 포맷과 브라우저 사이드 플러그인을 사용하였다. 초기 Ajax 기능을 발견한 digiGroups, Noosh 등은 프레임을 사용하여 웹 애플리케이션의 시각 컨텍스트를 새로 고치지 않고 정보를 사용자 브라우저에 전달했으며, 넷스케이프 4.0.5+, IE 5+의 표준 HTTP, HTML, 자바스크립트 기능만으로 실시간 리치 웹 애플리케이션을 구현했다. 크로포드는 자바스크립트가 이러한 시스템을 위한 객체 지향 메시지 포맷으로 사용될 수 있음을 발견하였다. 이 시스템은 썬 마이크로시스템즈, 아마존닷컴, EDS에 판매되었다. 2002년에는 JSON.org[103] 웹사이트가 런칭되었다.

크록포드는 기업 변호사와 지나치게 규칙을 찾는 사람들을 조롱하고자 JSON 라이선스에 "소프트웨어는 선을 위해 쓰여야 하며, 악을 위해 쓰여서는 안 된다"는 조항을 추가하였다.[100][101] 이 조항은 다른 오픈 소스 라이선스와의 라이선스 호환성 문제를 야기했다.[102]

크록포드는 JSON을 널리 알린 인물이지만, "The JSON Saga" 발표[79]에서 "나는 JSON이라고 이름 지었지만, 고안자는 아니며, 그 자체는 '자연스럽게' 존재하던 것으로, 1996년 Netscape Navigator에서 데이터 교환용으로 사용된 초기 사례가 있다. '발견했다'고 말할 수 있지만, 내가 처음은 아니다"라고 언급했다.

3. 표준

JSON은 2006년 RFC 4627로 처음 사양이 규정된 후, 여러 차례 개정되었다.[10] 2013년, ECMA-404로 표준화되었다.[10] 2017년, RFC 8259 (인터넷 표준 STD 90), ECMA-404 2nd edition, ISO/IEC 21778:2017이 발표되었다.[16][4] ECMA 및 ISO/IEC 표준은 허용되는 구문만 설명하는 반면, RFC는 보안 및 상호 운용성 고려 사항을 다룬다.[5]

IETF 및 ECMA 및 ISO의 사양 개정 연혁은 다음과 같다.

연도내용
2006년 7월
2013년 3월
2013년 10월[http://www.ecma-international.org/publications/standards/Ecma-404-arch.htm ECMA-404 1st edition]
2014년 3월
2017년 11월 30일[https://www.iso.org/standard/71616.html ISO/IEC 21778:2017]
2017년 12월 14일[78]및 [https://tools.ietf.org/html/std90 IETF STD 90] 및 [https://www.ecma-international.org/publications-and-standards/standards/ecma-404/ ECMA-404 2nd edition]


4. 문법 및 자료형

JSON은 텍스트 기반의 데이터 형식으로, 다음과 같은 기본 자료형을 갖는다.


  • 수(Number)
  • 문자열(String): 0개 이상의 유니코드 문자들의 연속. 큰따옴표(")로 구분하며 역슬래시를 이용한 이스케이프 문법을 지원한다.
  • 참/거짓(Boolean): `true` 또는 `false` 값
  • 배열(Array): 0 이상의 임의의 종류의 값으로 이루어진 순서가 있는 리스트. 대괄호([])로 나타내며 요소는 쉼표(,)로 구분한다.
  • 객체(Object): 순서가 없는 이름/값 쌍의 집합으로, 이름(키)이 문자열이다. 중괄호({})를 사용하며, 각 쌍은 쉼표(,)로 구분된다. 이름은 문자열이기 때문에 반드시 따옴표를 붙여야 한다.[14]
  • `null`: 빈 값으로, `null`을 사용한다.


JSON 메시지 단위는 배열이나 객체이다.

JSON은 2019년 개정판부터 ECMAScript의 엄격한 부분 집합이 되었다.[35][36]

개방형 생태계에서 JSON 교환은 UTF-8로 인코딩되어야 한다.[16]

JSON은 데이터 교환을 위한 구문적 프레임워크를 제공하지만, 명확한 데이터 교환을 위해서는 JSON 구문의 특정 사용에 대한 생산자와 소비자의 합의도 필요하다.[23]

공백 문자는 구문 요소(값 및 구두점, 문자열 값 내에서는 아님) 주변 또는 사이에 허용되며 무시된다. JSON은 주석에 대한 구문을 제공하지 않는다.[20]

4. 1. 문자열 (String)

JSON에서 문자열은 큰따옴표(")로 묶어야 하며, 유니코드 문자를 포함할 수 있다. 역슬래시(\\)를 사용하여 특수 문자를 표현할 수 있다.[80]

역슬래시(\\)는 다음과 같은 제어 문자를 표현하는 데 사용된다.[80]

  • `\b`: 백스페이스
  • `\f`: 폼 피드
  • `\n`: 개행
  • `\r`: 캐리지 리턴
  • `\t`: 탭
  • `\"`: 따옴표
  • `\/`: 슬래시
  • `\\`: 역슬래시
  • `\uHHHH`: 16진수 네 자리로 표현된 유니코드 문자 (예: `\u0041`는 'A'를 나타냄)


다음은 JSON 문자열의 예시이다.



"1234"

"Love"

"O-matic"

"한글"

"\"JSON\""



JSON은 유니코드 줄 바꿈 문자 및 문단 나눔 문자가 따옴표로 묶인 문자열에 이스케이프되지 않은 채로 나타나는 것을 허용하지만, ECMAScript 2018 및 이전 버전에서는 허용하지 않는다.[15][35] 최대 이식성을 위해 이러한 문자는 역슬래시로 이스케이프하는 것이 좋다.

예를 들어, 이모지 문자 😐를 JSON에 포함하려면 다음과 같이 표현할 수 있다.

```javascript

{ "face": "😐" }

// 또는

{ "face": "\uD83D\uDE10" }

```

프로그램 상에서 생성한 문자열을 JSON으로 취급하는 경우, 쌍따옴표 (")를 포함하는 문자열을 이용해야 한다.[80] JSON 생성 함수 (예: 자바스크립트의 `JSON.stringify`)를 이용하는 것이 더 안전하다.

4. 2. 수 (Number)

JSON에서 수는 10진수 표기만 허용되며, 8진수나 16진수 표기는 지원되지 않는다.[80] 부동 소수점 수의 경우 `1.0e-10`과 같은 지수 표기법도 사용할 수 있다.[80]

  • 정수



74

1974

750

  • 114
  • 273


  • 실수(고정 소수점)



3.14

  • 2.718


  • 실수(부동 소수점)



1e4

2.5e12

3.4e+4

4.56e-8

5.67E+10

6.78E-5


4. 3. 배열 (Array)

JSON에서 배열은 대괄호([])로 나타내며, 각 요소는 쉼표(,)로 구분된다. 배열의 각 요소는 기본 자료형이거나 배열, 객체가 될 수 있으며, 각 요소가 나타나는 순서에 의미가 있다.



[10, {"v": 20}, [30, "마흔"]]



배열은 0개 이상의 값을 쉼표로 구분하여 대괄호로 묶어 표현한다. 예를 들면 다음과 같다.



["milk", "bread", "eggs"]


4. 4. 객체 (Object)

객체는 이름/값 쌍의 집합으로, object영어는 중괄호({})를 사용하여 표현한다. 이름은 문자열이므로 따옴표를 붙여야 하고, 값은 기본 자료형이 될 수 있다. 각 쌍은 쉼표(,)로 구분되며, 순서는 중요하지 않다.[14]

JSON 메시지 단위는 배열이나 객체이다. 다음은 사람을 설명하는 JSON 표현의 예시이다.

```json

{

"first_name": "John",

"last_name": "Smith",

"is_alive": true,

"age": 27,

"address": {

"street_address": "21 2nd Street",

"city": "New York",

"state": "NY",

"postal_code": "10021-3100"

},

"phone_numbers": [

{

"type": "home",

"number": "212 555-1234"

},

{

"type": "office",

"number": "646 555-4567"

}

],

"children": [

"Catherine",

"Thomas",

"Trevor"

],

"spouse": null

}

```

JSON 객체는 이름-값 쌍의 모음이며, 여기서 이름(키)은 문자열이다. ECMA 표준에 따르면 "JSON 구문은 이름으로 사용되는 문자열에 제한을 두지 않고, 이름 문자열이 고유해야 한다고 요구하지 않으며, 이름/값 쌍의 순서에 어떠한 의미도 부여하지 않는다."[18] 객체는 중괄호로 구분되고 각 쌍을 구분하는 데 쉼표를 사용하며, 각 쌍 내에서 콜론 ':' 문자는 키 또는 이름을 해당 값과 구분한다.

JSON에서 표현되는 데이터 형식은 객체, 배열, 수치, 문자열, Boolean, `null` 등이 있으며, 이것들을 조합하여 데이터를 기술한다.[80] 객체는 순서가 정해지지 않은 키와 값의 쌍의 집합이며, JSON에서는 연관 배열과 동일하다.

객체는 키와 값의 쌍을 콜론으로 연결하고, 이 쌍들을 쉼표로 구분하여 0개 이상 나열하며, 전체를 중괄호로 묶어 표현한다. 예를 들어 다음과 같이 표현한다.

```json

{"name": "John Smith", "age": 33}

```

여기서 주의할 점은 키로 사용하는 데이터 형식은 문자열로 제한된다는 것이다.

5. 예제

json

{

"이름": "홍길동",

"나이": 55,

"성별": "남",

"주소": "서울특별시 양천구 목동",

"특기": ["검술", "코딩"],

"가족관계": {

"#": 2,

"아버지": "홍판서",

"어머니": "춘섬"

},

"회사": "경기 수원시 팔달구 우만동"

}

```

이는 한 사람에 관한 정보를 키-값 쌍(이름:값)의 패턴으로 표현한 JSON 객체의 예시이다.

다음은 또 다른 사람을 설명하는 JSON 표현의 예시이다.

```json

{

"first_name": "John",

"last_name": "Smith",

"is_alive": true,

"age": 27,

"address": {

"street_address": "21 2nd Street",

"city": "New York",

"state": "NY",

"postal_code": "10021-3100"

},

"phone_numbers": [

{

"type": "home",

"number": "212 555-1234"

},

{

"type": "office",

"number": "646 555-4567"

}

],

"children": [

"Catherine",

"Thomas",

"Trevor"

],

"spouse": null

}

6. 장점 및 활용

JSON은 텍스트로 이루어져 있어 사람과 기계가 모두 읽고 쓰기 쉽다. 또한, 프로그래밍 언어플랫폼에 독립적이어서 서로 다른 시스템 간에 객체를 교환하는 데 용이하다.[98] 더글라스 크록포드가 처음으로 JSON 포맷을 정의하고 보급하였으며,[99] 2005년 12월 야후!는 JSON으로 자사의 웹 서비스를 제공하기 시작했다.[104]

JSON은 자바스크립트 문법을 채용하여 웹 환경에서 유리하다. 자바스크립트에서 `eval` 명령을 통해 바로 사용할 수 있지만, 보안상 위험이 있어 모질라 파이어폭스 3.5, 인터넷 익스플로러 8, 오페라 10.5, 사파리, 구글 크롬 등 대부분의 최신 웹 브라우저에 내장된 JSON 전용 파서 기능(`JSON.parse`)을 사용하는 것이 안전하고 빠르다.

비동기 자바스크립트와 JSON(AJAJ)은 Ajax와 동일하게 동적 웹 페이지를 만드는 기술이지만, XML 대신 JSON을 데이터 형식으로 사용한다. AJAJ는 웹 브라우저가 웹 페이지를 로드한 후 새로운 데이터를 요청할 때 사용되며, 주로 사용자 작업에 대한 응답으로 서버에서 새로운 데이터를 렌더링한다.

6. 1. Ajax에서의 JSON 활용 예

XMLHttpRequest를 사용하여 비동기적으로 JSON 형식의 데이터를 수신하는 예시는 다음과 같다.



var the_object;

var http_request = new XMLHttpRequest();

http_request.open( "GET", url, true );

http_request.onreadystatechange = function () {

if ( http_request.readyState == 4 ) {

if ( http_request.status == 200 ) {

the_object = eval( "(" + http_request.responseText + ")" );

} else {

alert( "URL에 문제가 있습니다." );

}

http_request = null;

}

};

http_request.send(null);





var the_object;

var http_request = new XMLHttpRequest();

http_request.open( "GET", url, true );

http_request.responseType = "json";

http_request.addEventListener ( "load", function ( ev ) {

if ( ev.target.status == 200 ) {

the_object = http_request.response;

} else {

alert( "There was a problem with the URL." );

}

delete http_request;

});

http_request.send(null);



여기서 `http_request`는 XMLHttpRequest 객체이며, 이를 사용하여 `url`에 접근하여 반환된 JSON으로 기술된 데이터를 `the_object`에 저장한다. 현재 XMLHttpRequest를 사용하여 구현했지만, iframe 등 다른 구현 방법도 있다. 또한 JavaScript 라이브러리인 prototype.js에서는 HTTP의 `X-JSON` 헤더를 사용하여 JSON 데이터를 간단하게 주고받을 수 있다.

7. JSONPath

JSONPath는 JSON 문서의 특정 부분을 질의하기 위한 표현식으로, XML의 XPath와 유사한 역할을 한다. 2007년 Stefan Gössner에 의해 제안되었고[81], 2024년 2월 RFC 9535로 사양이 제정되었다.[82] 다양한 프로그래밍 언어 및 데이터베이스에서 지원된다. Oracle Database[83], Microsoft SQL Server[84], MySQL[85], PostgreSQL[86], MongoDB[87], RedisJSON[88] 등에서 널리 채용되고 있다.

예를 들어, 아래 JSON에 대한 `$.users[0:2].name`의 결과는 `["Foo", "Bar"]`가 된다.

```json

{

"users": [

{"name": "Foo"},

{"name": "Bar"},

{"name": "Baz"}

]

}

8. 관련 형식

JSON은 XML과 달리 마크업 언어가 아니지만, 웹 브라우저에서 사용할 수 있다는 공통점이 있다. 그러나 두 형식 모두 큰 바이너리 데이터를 처리하는 메커니즘은 없다.[39]

XML은 구조화된 데이터를 설명하고 객체를 직렬화하는 데 사용되어 왔으며, JSON과 동일한 데이터 교환 목적으로 다양한 XML 기반 프로토콜이 존재한다. XML로 데이터를 인코딩하는 방법은 여러 가지가 있는데, 태그 쌍을 사용하는 일반적인 형식은 JSON보다 훨씬 더 많은 문자를 사용한다. 하지만 데이터가 속성에 저장되고 닫는 태그가 `/>`로 대체되는 '짧은 태그' 형태에서는 JSON과 거의 비슷하거나 약간 더 크다. 그러나 XML 속성은 단일 값만 가질 수 있으며, 각 속성은 각 요소에 최대 한 번만 나타날 수 있다.[39]

XML은 "데이터"와 "메타데이터"를 요소와 속성을 사용하여 분리하지만, JSON은 이러한 개념을 구분하지 않는다.[39] 값 주소 지정 방식에도 차이가 있는데, JSON은 "키"와 "값"의 간단한 매핑을 가진 객체를 사용하는 반면, XML에서는 모든 노드가 XML 프로세서를 통해 고유한 ID를 받는 "노드"에서 주소가 지정된다. 또한 XML 표준은 사용자가 ID를 명시적으로 설정할 수 있는 공통 속성 `xml:id`를 정의한다.[39]

XML 태그 이름은 `!"#$%&'()*+,/;<=>?@[\]^`

~` 문자와 공백 문자를 포함할 수 없으며, `-`, `.`, 또는 숫자로 시작할 수 없다. 반면 JSON 키는 따옴표와 백슬래시를 이스케이프해야 하는 경우에도 이러한 제약이 없다.[41]

XML 값은 형 안전성이 없는 '문자'의 문자열이다. XML은 강력한 형식 지정, 사용자 정의 형식, 미리 정의된 태그 및 공식적인 구조를 허용하여 XML 스트림의 유효성 검사를 가능하게 하는 스키마 개념을 가지고 있다. JSON에는 여러 형식이 내장되어 있으며, JSON 스키마에서 유사한 스키마 개념을 제공한다.[39] XML은 주석을 지원하지만 JSON은 지원하지 않는다.[42][20]

8. 1. 개행 구분 JSON (Newline Delimited JSON)

여러 사람이 제안한, 한 줄을 하나의 JSON으로 하는 개행 구분 JSON이 있다. 사양은 동일하다. 개행 문자는 \n을 사용해야 하지만, JSON의 끝에 \r이 있어도 무시되므로 \r\n도 사용할 수 있다.

  • JSON Lines (JSONL)[89] - 확장자는 .jsonl, MIME 타입은 application/jsonl
  • Newline delimited JSON (NDJSON)[90] (구칭 Line delimited JSON, LDJSON[91]) - 확장자는 .ndjson, MIME 타입은 application/x-ndjson


쉼표로 구분된 값보다 유연성이 있으며, JSON 배열을 사용하는 것보다 가독성이 높고 스트리밍할 수 있다. 다음은 예시이다.

```json

{"ts":"2020-06-18T10:44:12","started":{"pid":45678}}

{"ts":"2020-06-18T10:44:13","logged_in":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}

{"ts":"2020-06-18T10:44:15","registered":{"username":"bar","email":"bar@example.com"},"connection":{"addr":"2.3.4.5","port":6789}}

{"ts":"2020-06-18T10:44:16","logged_out":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}

8. 2. JSON5

'''JSON5'''는 ECMAScript 5.1에 기반하여 사람이 더 읽고 쓰기 쉽도록 제안된 JSON의 확장 형식이다.[92] 주석을 작성할 수 있으며, 객체의 키에 큰따옴표(")가 필요 없고, 마지막 쉼표를 허용하는 등의 특징을 가진다.[92] 확장자는 .json5이며, MIME 타입은 application/json5이다.[92]

JSON5는 2012년에 시작되어 2018년 버전 1.0.0으로 완성되었다.[62] JSON 구문과의 주요 차이점은 다음과 같다.

  • 선택적 후행 쉼표
  • 따옴표가 없는 객체 키
  • 작은따옴표 및 여러 줄 문자열
  • 추가 숫자 형식
  • 주석


JSON5 구문은 일부 소프트웨어에서 JSON 구문의 확장으로 지원된다. 예를 들어 SQLite에서 지원된다.[63] HJSON, HOCON과 같이 JSON 상위 집합의 비표준 중 하나이다.[43][46][44]

8. 3. JSONC

JSONC는 'JSON with Comments'의 약자로, 주석을 허용하는 JSON의 변형이다. 주로 설정 파일 등에서 사용된다.

JSONC는 마이크로소프트의 Visual Studio Code에서 사용되는 JSON5의 하위 집합이다.[64]

  • 한 줄 주석(//)과 블록 주석(/* */)을 지원한다.
  • 후행 쉼표를 허용하지만 권장하지 않으며, 편집기에서 경고를 표시한다.

8. 4. YAML

YAML 버전 1.2는 JSON의 상위 집합이다. 이전 버전은 엄격하게 호환되지 않았다. 예를 들어, 슬래시(/)를 백슬래시(\)로 이스케이프하는 것은 JSON에서는 유효하지만 YAML에서는 유효하지 않았다.[45] YAML은 주석을 지원하지만 JSON은 지원하지 않는다.[45][46][20]

JSON은 YAML의 서브셋으로 간주할 수 있다.[93] YAML에는 블록 형식과 인라인 형식(플로우 형식)의 표기법이 있는데, JSON은 후자에 더욱 제약을 가한 것으로 볼 수 있다. 예를 들어 루비에서는 다음과 같이 JSON을 YAML로 읽을 수 있다.

YAML 1.1 이전에는 배열과 연관 배열의 구분자를 각각 쉼표와 공백(", ") 형태로 사용함으로써 JSON의 상위 집합이 되었지만, YAML 1.2에서는 구분 문자도 호환되어 정상적인 JSON 문서에서는 공식적으로 완전한 상위 집합이 되었다. 약간의 차이점으로, 연관 배열의 키가 고유해야 한다는 점을 JSON에서는 SHOULD 수준으로 요구하는 반면, YAML 1.2에서는 MUST 수준으로 요구하기[94] 때문에, 해당 이상 데이터의 에러 처리에 차이가 발생할 수 있다.

8. 5. XML

JSON은 XML과 달리 마크업 언어가 아니다. 웹 브라우저에서 사용할 수 있다는 점에서는 공통점을 가지지만, 두 형식 모두 거대한 바이너리 데이터를 처리하는 메커니즘이 없다.[39]

XML은 구조화된 데이터를 설명하고 객체를 직렬화하는 데 사용되어 왔다. JSON과 동일한 종류의 데이터 교환 목적으로 JSON과 동일한 종류의 데이터 구조를 표현하기 위해 다양한 XML 기반 프로토콜이 존재한다. 데이터는 여러 가지 방법으로 XML로 인코딩될 수 있다. 태그 쌍을 사용하는 가장 광범위한 형식은 JSON보다 훨씬 더 큰(문자 수) 표현을 생성하지만, 데이터가 속성에 저장되고 닫는 태그가 `/>`로 대체되는 '짧은 태그' 형태에서는 표현이 JSON과 거의 같거나 약간 더 크다. 그러나 XML 속성은 단일 값만 가질 수 있으며 각 속성은 각 요소에 최대 한 번만 나타날 수 있다.[39]

XML은 "데이터"를 "메타데이터"와 분리하는 반면(요소와 속성을 사용), JSON은 그러한 개념이 없다.[39]

또 다른 주요 차이점은 값의 주소 지정이다. JSON은 간단한 "키" 대 "값" 매핑을 가진 객체를 가지고 있는 반면, XML에서는 모든 노드가 XML 프로세서를 통해 고유한 ID를 받게 되는 "노드"에서 주소가 지정된다. 또한 XML 표준은 사용자가 ID를 명시적으로 설정하는 데 사용할 수 있는 공통 속성 `xml:id`를 정의한다.[39]

XML 태그 이름은 `!"#$%&'()*+,/;<=>?@[\]^`

~` 문자와 공백 문자를 포함할 수 없으며 `-`, `.`, 또는 숫자 숫자로 시작할 수 없는 반면, JSON 키는 (따옴표와 백슬래시를 이스케이프해야 하는 경우에도) 가능하다.[41]

XML 값은 형 안전성이 없는 ''문자''의 문자열이다. XML에는 강력한 형식 지정, 사용자 정의 형식, 미리 정의된 태그 및 공식적인 구조를 허용하여 XML 스트림의 공식적인 유효성 검사를 가능하게 하는 스키마의 개념이 있다. JSON에는 여러 형식이 내장되어 있으며 JSON 스키마에서 유사한 스키마 개념을 가지고 있다.[39]

XML은 주석을 지원하는 반면 JSON은 그렇지 않다.[42][20]

9. 상호 운용성

RFC 8259는 JSON 구문의 특정 측면에서 상호 운용성 문제가 발생할 수 있음을 설명한다. 주요 내용은 다음과 같다.


  • 일부 JSON 구현은 객체 또는 배열만 JSON 텍스트로 허용한다. 따라서 상호 운용성을 위해서는 객체 또는 배열 형태의 메시지를 전송해야 한다.
  • JSON 객체 내에서 동일한 이름을 가진 멤버가 여러 개 존재할 수 있지만, 이 경우 구현체의 동작이 예측 불가능하다. 상호 운용성을 위해 중복된 이름을 피해야 한다.
  • JSON 객체 멤버의 순서는 중요하지 않지만, 구문 분석 소프트웨어에 따라 순서가 다를 수 있다. 따라서 멤버 순서에 의미를 부여하지 않아야 한다.
  • JSON 숫자 리터럴의 크기나 정밀도에는 제한이 없지만, 널리 사용되는 JavaScript 구현은 IEEE 754 "binary64" 형식으로 저장한다. 따라서 이 방식으로 표현할 수 없는 숫자는 전송하지 않아야 한다. (예: 1E400, 3.141592653589793238462643383279)
  • JSON 텍스트의 유니코드 문자 인코딩은 제한되지 않지만, 대부분 UTF-8 인코딩을 사용한다. 따라서 상호 운용성을 위해 항상 UTF-8로 인코딩해야 한다.
  • 유니코드 문자를 잘못 나타내는 바이트 시퀀스 전송은 금지되지 않지만, 상호 운용성을 위해 이러한 시퀀스를 포함하지 않아야 한다.
  • 유니코드 문자열 비교 방법은 제한되지 않지만, 상호 운용성을 위해 항상 코드 단위별로 비교해야 한다.


2015년, IETF는 이러한 상호 운용성 문제를 최소화하기 위해 JSON의 구문 및 처리를 제한하는 "I-JSON 메시지 형식"을 정의한 RFC 7493을 발표했다.

10. 보안

JSON은 텍스트로 이루어져 있어 사람과 기계가 모두 읽고 쓰기 쉽다. 프로그래밍 언어플랫폼에 독립적이어서 서로 다른 시스템 간에 객체를 교환하는 데 유리하다. 자바스크립트 문법을 따르기 때문에 자바스크립트에서 `eval` 명령으로 바로 사용할 수 있다는 장점이 있지만, 이는 외부의 악성 코드 유입을 초래할 수 있어 보안에 취약하다.

JSON 텍스트를 자바스크립트 `eval()` 함수로 처리하는 것은 보안상 위험할 수 있다. 특히 2019년 이전 구형 자바스크립트 엔진에서는 Line Separator|줄 구분 기호영어 (U+2028) 또는 Paragraph Separator|문단 구분 기호영어 (U+2029)를 포함하는 특정 유효한 JSON 텍스트가 유효한 자바스크립트 코드가 아니었기 때문에 문제가 발생할 수 있었다.[32]

이러한 문제점을 해결하기 위해 ECMAScript 다섯 번째 판에 `JSON.parse()` 함수가 추가되었으며,[33] 2017년 기준으로 모질라 파이어폭스, 인터넷 익스플로러, 오페라, 사파리, 구글 크롬 등 대부분의 주요 웹 브라우저에서 지원된다. 지원되지 않는 브라우저의 경우, 더글러스 크록포드가 API 호환 자바스크립트 라이브러리를 제공한다.[34] 또한, TC39의 "Subsume JSON" 제안으로 인해 ECMAScript는 2019년 개정판부터 JSON의 상위 집합이 되었다.[35][36]

다양한 JSON 파서 구현은 서비스 거부 공격 및 대량 할당 취약점에 취약할 수 있다.[37][38] 따라서 JSON 파서를 구현하거나 사용할 때 보안에 유의해야 한다.

참조

[1] 웹사이트 Douglas Crockford: The JSON Saga https://www.youtube.[...] YouTube 2011-08-28
[2] 웹사이트 ECMA-404: The JSON Data Interchange Syntax https://ecma-interna[...] Ecma International 2017-12
[3] 서적 UNIX and Linux System Administration Handbook Addison-Wesley Professional 2017
[4] 웹사이트 ISO/IEC 21778:2017 http://www.iso.org/c[...]
[5] 웹사이트 JSON Redux AKA RFC7159 https://www.tbray.or[...]
[6] 웹사이트 Unofficial Java History http://www.edu4java.[...] 2014-05-26
[7] 웹사이트 JSON http://json.org/
[8] 웹사이트 Using JSON with Yahoo! Web services http://developer.yah[...]
[9] 웹사이트 Introducing JSON http://json.org json.org 2009-05-28
[10] 웹사이트 ECMA-404: The JSON Data Interchange Format https://ecma-interna[...] Ecma International 2013-10
[11] 간행물 History for draft-ietf-jsonbis-rfc7159bis-04 https://datatracker.[...] Internet Engineering Task Force 2017-12
[12] 간행물 RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format https://datatracker.[...] Internet Engineering Task Force 2017-12-13
[13] 뉴스 Apache and the JSON license https://lwn.net/Arti[...] LWN.net 2016-11-30
[14] 웹사이트 JSON in JavaScript http://www.json.org/[...] 2016-07-10
[15] 웹사이트 JSON: The JavaScript subset that isn't http://timelessrepo.[...] The timeless repository 2011-05-15
[16] 간행물 The JavaScript Object Notation (JSON) Data Interchange Format https://tools.ietf.o[...] IETF 2017-12
[17] 웹사이트 BigInt - MDN Web doc glossary https://developer.mo[...]
[18] 문서 ECMA-404, 2nd ed.
[19] 웹사이트 Printing Floating-Point Numbers - An Always Correct Method https://cseweb.ucsd.[...]
[20] 웹사이트 Comments in JSON https://plus.google.[...] 2012-04-30
[21] 웹사이트 Trailing commas - JavaScript {{!}} MDN https://developer.mo[...] 2023-09-12
[22] 웹사이트 JSON5 https://json5.org/ json5
[23] 문서 ECMA-404, 2nd ed.
[24] 웹사이트 Media Types https://www.iana.org[...]
[25] 웹사이트 Correct Content-Type Header for JSON https://reqbin.com/r[...] 2023-01-13
[26] 간행물 11. IANA Considerations https://datatracker.[...] IETF 2017-12
[27] 웹사이트 JSON Schema and Hyper-Schema https://json-schema.[...]
[28] 웹사이트 JSON Schema - Specification Links https://json-schema.[...]
[29] 웹사이트 JSON Schema Implementations https://json-schema.[...]
[30] 간행물 JSON Reference: draft-pbryan-zyp-json-ref-03 https://datatracker.[...] 2012-09-16
[31] 웹사이트 JSMin https://www.crockfor[...] 2019-05-16
[32] 웹사이트 JSON: The JavaScript subset that isn't http://timelessrepo.[...] Magnus Holm
[33] 웹사이트 ECMA-262: ECMAScript Language Specification https://ecma-interna[...] 2009-12
[34] 웹사이트 douglascrockford/JSON-js https://github.com/d[...] 2019-08-13
[35] 웹사이트 Subsume JSON: Proposal to make all JSON text valid ECMA-262 https://tc39.es/prop[...] Ecma TC39 2019-08-23
[36] 웹사이트 Advance to Stage 4 - tc39/proposal-json-superset https://github.com/t[...] 2018-05-22
[37] 웹사이트 Denial of Service and Unsafe Object Creation Vulnerability in JSON (CVE-2013-0269) https://www.ruby-lan[...] 2016-01-05
[38] 웹사이트 Microsoft .NET Framework JSON Content Processing Denial of Service Vulnerability http://tools.cisco.c[...] 2016-01-05
[39] 웹사이트 JSON: The Fat-Free Alternative to XML http://www.json.org/[...] json.org 2011-03-14
[40] 웹사이트 Amazon Ion https://amazon-ion.g[...] Amazon 2024-08-26
[41] 웹사이트 XML 1.1 Specification https://www.w3.org/T[...] World Wide Web Consortium 2019-08-26
[42] 서적 Client-server web apps with Javascript and Java "O'Reilly Media, Inc." 2014
[43] 서적 Network Programmability and Automation O'Reilly Media
[44] 웹사이트 HOCON (Human-Optimized Config Object Notation) https://github.com/l[...] 2019-08-28
[45] 웹사이트 YAML Ain't Markup Language (YAML™) Version 1.2 http://www.yaml.org/[...] 2015-09-13
[46] 웹사이트 Why JSON isn't a good configuration language https://www.lucidcha[...] Lucid Chart 2019-06-15
[47] 웹사이트 CoffeeScript Object Notation https://www.lee-dohm[...] 2014-01-01
[48] 웹사이트 Basic Customization https://flight-manua[...] GitHub 2024-04-29
[49] 웹사이트 CSON https://github.com/b[...] Bevry 2023-12-20
[50] 웹사이트 CSON https://github.com/l[...] 2023-02-27
[51] 웹사이트 config/HOCON.md at master · lightbend/config https://github.com/l[...] 2021-08-05
[52] 웹사이트 Config File - 2.5.x https://www.playfram[...] 2021-08-05
[53] 문서 Akka.NET HOCON Docs https://getakka.net/[...]
[54] 웹사이트 Akka.NET Documentation | Akka.NET Documentation https://getakka.net/ 2021-08-05
[55] 웹사이트 Managing HOCON configuration files with Puppet https://puppet.com/b[...] 2023-03-04
[56] 웹사이트 StreamBase Documentation https://docs.streamb[...] 2021-08-05
[57] 웹사이트 Configuration Guide https://docs.streamb[...] 2021-08-05
[58] 웹사이트 StreamBase New and Noteworthy Archive https://docs.streamb[...] 2021-08-05
[59] 웹사이트 Exabeam Advanced Analytics Release Notes https://docs.exabeam[...] 2023-03-04
[60] 웹사이트 Config phase 1 https://github.com/j[...] 2021-02-16
[61] 웹사이트 reference.conf https://github.com/j[...] 2021-02-16
[62] 웹사이트 The JSON5 Data Interchange Format https://spec.json5.o[...] 2022-06-25
[63] 웹사이트 JSON Functions And Operators https://www.sqlite.o[...] 2023-06-25
[64] 웹사이트 JSON with Comments - JSON editing in Visual Studio Code https://code.visuals[...] Microsoft 2024-04-29
[65] 간행물 RFC 7946 - The GeoJSON Format https://datatracker.[...] 2016-08-01
[66] 웹사이트 GeoJSON https://geojson.org/ 2022-08-07
[67] 웹사이트 JSON-LD 1.1 https://www.w3.org/T[...] 2020-07-16
[68] 웹사이트 JSON-LD - JSON for Linking Data https://json-ld.org/ 2022-08-07
[69] 웹사이트 JSON-RPC https://www.jsonrpc.[...] 2022-06-17
[70] 웹사이트 JsonML (JSON Markup Language) http://www.jsonml.or[...] 2022-06-17
[71] Citation JsonML https://github.com/m[...] 2022-06-14
[72] 웹사이트 FasterXML/smile-format-specification: New home for Smile format https://github.com/F[...] 2022-06-17
[73] 웹사이트 Understanding Smile — A data format based on JSON https://medium.com/c[...] 2022-08-07
[74] 웹사이트 Universal Binary JSON Specification – The universally compatible format specification for Binary JSON https://ubjson.org/ 2022-06-17
[75] 웹사이트 UBJSON - JSON for Modern C++ https://json.nlohman[...] 2022-08-07
[76] 문서 JSON is a lightweight, text-based, language-independent syntax for defining data interchange formats. https://www.ecma-int[...]
[77] 웹사이트 Introducing JSON http://json.org/ json.org 2008-04-19
[78] 문서 ongoing by Tim Bray · The Last JSON Spec https://www.tbray.or[...]
[79] Youtube Douglas Crockford: The JSON Saga - YouTube https://www.youtube.[...]
[80] 문서 A JSON value can be an object, array, number, string, true, false, or null. https://www.ecma-int[...]
[81] 웹사이트 JSONPath - XPath for JSON https://goessner.net[...] 2023-06-08
[82] 웹사이트 JSONPath Comparison https://cburgmer.git[...] 2024-05-10
[83] 웹사이트 JSON Developer's Guide https://docs.oracle.[...] 2023-06-08
[84] 웹사이트 JSON Path Expressions - SQL Server https://learn.micros[...] 2023-06-08
[85] 웹사이트 MySQL :: MySQL 8.0 Reference Manual :: 11.5 The JSON Data Type https://dev.mysql.co[...] 2023-06-08
[86] 문서 PostgreSQL: Documentation: 15: 9.16. JSON Functions and Operators https://www.postgres[...]
[87] 웹사이트 json-path Output Type — MongoDB Command Line Interface https://www.mongodb.[...] 2023-06-08
[88] 웹사이트 Path https://redis.io/doc[...] 2023-06-08
[89] 웹사이트 JSON Lines https://jsonlines.or[...] 2024-07-04
[90] 웹사이트 ndjson/ndjson-spec: Specification https://github.com/n[...] 2024-07-04
[91] 문서 Update specification_draft2.md · ndjson/ndjson-spec@c658c26 https://github.com/n[...]
[92] 웹사이트 JSON5 – JSON for Humans https://json5.org/ 2023-05-31
[93] 웹사이트 YAML is JSON http://redhanded.hob[...] 2013-05-15
[94] 웹사이트 3.2.1. Representation Graph - YAML Ain’t Markup Language (YAML™) Version 1.2 http://www.yaml.org/[...] yaml.org 2013-05-15
[95] 웹인용 Doug Crockford "Google Tech Talks: JavaScript: The Good Parts" https://www.youtube.[...] 2009-02-07
[96] 웹인용 ISO/IEC 21778:2017 http://www.iso.org/c[...] 2019-07-29
[97] 웹인용 JSON Redux AKA RFC7159 https://www.tbray.or[...] 2014-03-16
[98] 웹인용 Unofficial Java History http://www.edu4java.[...] 2019-08-30
[99] 웹인용 Douglas Crockford — The JSON Saga https://www.youtube.[...] YouTube 2016-09-23
[100] 웹인용 Chip Morningstar Biography http://www.fudco.com[...] n.d.
[101] 뉴스 State Software Breaks Through Web App Development Barrier With State Application Framework: Software Lets Developers Create Truly Interactive Applications; Reduces Costs, Development Time and Improves User Experience http://www.prnewswir[...] 2013-03-19
[102] 문서 Apache and the JSON license https://lwn.net/Arti[...] LWN.net 2016-11-30
[103] 웹인용 JSON http://json.org/
[104] 웹인용 Using JSON with Yahoo! Web services http://developer.yah[...] 2009-07-03
[105] 웹인용 Introducing JSON http://json.org json.org 2009-07-03
[106] 웹인용 GBSON - A new annotation file format based on JSON https://web.archive.[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com