{{위키데이터 속성 추적}}
{{Infobox file format
| name          = JavaScript Object Notation
| icon          = [[파일:JSON vector logo.svg|64px]]
| mime          = application/json
| type_code     = TEXT
| extension     = .json
| uniform_type  = public.json
| developer     = 
| genre         = 데이터 교환
| extended_from = [[JavaScript]]
| standard      = [https://tools.ietf.org/html/std90 STD 90] ({{IETF RFC|8259}}), [http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ECMA-404], [https://www.iso.org/standard/71616.html ISO/IEC 21778:2017]
| open          = 예
| url           = {{URL|https://json.org/}}
}}
'''JSON'''('''제이슨'''<ref name="Pronunciation">{{웹 인용 | 제목 = Doug Crockford "Google Tech Talks: JavaScript: The Good Parts" | date = 7 February 2009 | url = https://www.youtube.com/watch?v=hQVTIJBZook&t=2405 }}</ref>, {{lang|en|JavaScript Object Notation}})은 [[속성-값 쌍]](attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 '''키-값 쌍'''으로 이루어진 [[데이터 오브젝트]]를 전달하기 위해 인간이 읽을 수 있는 [[텍스트]]를 사용하는 [[개방형 표준]] 포맷이다. 비동기 브라우저/서버 통신 ([[Ajax|AJAX]])을 위해, 넓게는 [[XML]]([[Ajax|AJAX]]가 사용)을 대체하는 주요 데이터 포맷이다. 특히 [[인터넷]]에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 [[컴퓨터 프로그램]]의 [[변수 (컴퓨터 과학)|변수]]값을 표현하는 데 적합하다.

본래는 [[자바스크립트]] 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, [[프로그래밍 언어]]나 [[컴퓨팅 플랫폼|플랫폼]]에 독립적이므로, [[구문 분석]] 및 JSON 데이터 생성을 위한 코드는 [[C (프로그래밍 언어)|C]], [[C++]], [[C 샤프|C#]], [[자바 (프로그래밍 언어)|자바]], [[자바스크립트]], [[펄]], [[파이썬]] 등 수많은 [[프로그래밍 언어]]에서 쉽게 이용할 수 있다.

JSON 포맷은 본래 [[더글라스 크록포드]]가 규정하였다. RFC 7159와 ECMA-404 그리고 ISO/IEC 21778:2017<ref>{{웹 인용|url=http://www.iso.org/cms/render/live/en/sites/isoorg/contents/data/standard/07/16/71616.html|제목=ISO/IEC 21778:2017|성=14:00-17:00|언어=en|확인날짜=2019-07-29}}</ref> 표준에 의해 기술되고 있다. KS 부합화 표준은 아직 제정되지 않았으며, TTA 협회 표준명은 [http://committee.tta.or.kr/data/standard_view.jsp?commit_code=STC2&firstDepthCode=STC2&pk_num=TTAE.OT-10.0394&nowSu=1 TTAE.OT-10.0394]이다.  ECMA 표준과 ISO/IEC 표준은 문법만 정의할 정도로 최소한으로만 정의되어 있는 반면 RFC는 시맨틱, 보안적 고려 사항을 일부 제공한다.<ref>{{웹 인용|last=Bray|first=Tim|제목=JSON Redux AKA RFC7159|url=https://www.tbray.org/ongoing/When/201x/2014/03/05/RFC7159-JSON|work=Ongoing|accessdate=16 March 2014}}</ref> JSON의 공식 인터넷 미디어 타입은 <code>application/json</code>이며, JSON의 파일 확장자는 <code>.json</code>이다.

== 역사 ==
[[파일:Douglas Crockford.jpg|섬네일|야후 건물의 더글라스 크록포드(2007년)]]
JSON은 2000년대 초에 널리 사용된 방식인 [[플래시]]나 [[자바 (프로그래밍 언어)|자바]] 애플릿 등의 브라우저 플러그인을 사용하지 않는 [[상태 (컴퓨터 과학)|무상태]], 실시간 서버 대 브라우저 통신 프로토콜의 요구에 의거하여 성장하였다.<ref name = "Edu4java, 2014" >{{웹 인용| url = http://www.edu4java.com/en/java/unofficial-java-history.html | title = Unofficial Java History  | access-date = 2019-08-30 | date = 2014-05-26 | website = Edu4Java | quote = In 1996, Macromedia launches Flash technology which occupies the space left by Java and ActiveX, becoming the de facto standard for animation on the client side. | archive-url = https://web.archive.org/web/20140526235903/http://www.edu4java.com/en/java/unofficial-java-history.html | archive-date = 2014-05-26 | df = dmy-all }}</ref>

[[더글라스 크록포드]]가 처음으로 JSON 포맷을 정의하고 보급하였다.<ref>{{웹 인용| url= https://www.youtube.com/watch?v=-C-JoyNuQJs | title= Douglas Crockford — The JSON Saga | publisher= YouTube | date= 28 August 2011 | accessdate= 23 September 2016}}</ref> 이 두문자어는 2001년 3월 크록포드 등이 공동 설립한 기업인 스테이트 소프트웨어(State Software)에서 기원하였다. 이 공동 설립자들은 표준 브라우저 기능을 사용하였던 시스템을 빌드하기로 합의하였고 2개의 [[하이퍼텍스트 전송 프로토콜]](HTTP) 연결을 개방시키고 추가 데이터 교환이 없으면 표준 브라우저 타임아웃 전에 이것들을 재활용함으로써 웹 서버에 영속적인 반이중 통신을 지원하는, 상태를 인지하는(stateful) 웹 애프리케이션 개발을 위해 웹 개발자들을 위한 [[추상화 계층]]을 제공하였다. 이 공동 설립자들은 원탁 회의에 참여하였고 데이터 포맷을 JSML으로 부를지, JSON으로 부를지 투표를 했으며, 어떠한 [[소프트웨어 라이선스|라이선스]] 형태로 배포할 것인지도 논의하였다. 크록포드는 기업 법률가와 지나치게 규칙을 찾는 사람들을 조롱하고자 JSON 라이선스에다 "소프트웨어는 선을 위해 쓰여야 하며, 악을 위해 쓰여서는 안 된다"는 조항을 하나 추가하였다. [[칩 모닝스타]]는 스테이트 소프트웨어에서 스테이트 애플리케이션 프레임워크의 아이디어를 냈다.<ref name =" Morningstar">{{웹 인용| title = Chip Morningstar Biography | date = n.d. | url = http://www.fudco.com/chip/resume.html }}
</ref><ref name = "State Software">{{뉴스 인용| url = http://www.prnewswire.com/news-releases/state-software-breaks-through-web-app-development-barrier-with-state-application-framework-75971782.html | title = 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 | date = February 12, 2002 | work = PR Newswire | access-date = March 19, 2013 | archive-url = https://web.archive.org/web/20130605095712/http://www.prnewswire.com/news-releases/state-software-breaks-through-web-app-development-barrier-with-state-application-framework-75971782.html | archive-date = June 5, 2013 | url-status = dead | df = mdy-all }}</ref> 한편, 이 조항으로 인해 JSON의 [[라이선스 호환성]] 문제가 다른 [[오픈 소스 라이선스]]와 불거지게 되었다.<ref>[https://lwn.net/Articles/707510/ Apache and the JSON license] on LWN.net by Jake Edge (November 30, 2016)</ref>

JSON 라이브러리의 전신은 카툰 네트워크의 Communities.com라는 이름의 아동용 디지털 자산 트레이딩 게임 프로젝트에 사용되었으며, [[동적 HTML|DHTML]] 요소(이 시스템은 3DO 소유이기도 했음)를 조작하기 위한 사유 메시지 포맷과 더불어 브라우저 사이드 플러그인을 사용하였다. 초기 [[Ajax]]의 기능을 발견한 digiGroups, Noosh 등은 프레임을 사용하여 웹 애플리케이션의 시각 컨텍스트를 새로 고치지 않은 채 정보를 사용자 브라우저의 시각 필드로 전달했으며, 이로써 넷스케이프 4.0.5+, IE 5+의 표준 HTTP, HTML, 자바스크립트 기능만을 사용하여 실시간 리치 웹 애플리케이션을 실현시켰다. 이때 크로포드는 자바스크립트가 이러한 시스템을 위한 객체 지향 메시지 포맷으로 사용될 수 있음을 발견하였다. 이 시스템은 [[썬 마이크로시스템즈]], [[아마존닷컴]], [[일렉트로닉 데이터 시스템즈|EDS]]로 판매되었다. JSON.org<ref>{{웹 인용|url=http://json.org/|title=JSON|website=json.org}}</ref> 웹사이트는 2002년 런칭되었다. 2005년 12월, [[야후!]]는 JSON으로 자사의 [[웹 서비스]]를 제공하기 시작했다.<ref name="yahoo">{{웹 인용|url= http://developer.yahoo.com/common/json.html |title= Using JSON with Yahoo! Web services |author= Yahoo! |accessdate= July 3, 2009 | archiveurl = https://web.archive.org/web/20071011085815/http://developer.yahoo.com/common/json.html |archivedate= October 11, 2007|author-link= Yahoo! }}</ref>

JSON은 [[자바스크립트]] 스크립트 언어의 서브셋에 기반을 두었다. (구체적으로는 표준 [[Ecma 인터내셔널|ECMA]]-262 제3판—1999년 12월<ref>{{웹 인용
| url = http://json.org | title = Introducing JSON | publisher = json.org |first=Douglas |last=Crockford |authorlink=Douglas Crockford |date=May 28, 2009 |accessdate=July 3, 2009 |quote=It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999.}}</ref>) 그리고 자바스크립트와 함께 흔히 사용되었으나 [[언어 독립 사양|언어 독립]]적인 데이터 포맷이기도 했다. JSON 데이터의 [[구문 분석]] 및 생성을 위한 코드는 수많은 [[프로그래밍 언어]]에서 쉽게 볼 수 있다. JSON의 웹사이트는 언어별로 JSON [[언어 바인딩|라이브러리]]를 나열한다.

== 자료형과 문법 ==
=== 기본 자료형 ===
JSON의 기본 자료형은 다음과 같다:

* 수(Number)
* [[문자열|문자열(String)]]: 0개 이상의 [[유니코드]] 문자들의 연속. 문자열은 큰 따옴표(")로 구분하며 역슬래시 [[이스케이프 문자|이스케이프]] 문법을 지원한다.
* [[불리언 자료형|참/거짓(Boolean)]]: <code>true</code> 또는 <code>false</code> 값
* [[배열|배열(Array)]]: 0 이상의 임의의 종류의 값으로 이루어진 [[리스트 (컴퓨팅)|순서가 있는 리스트]]. 대괄호로 나타내며 요소는 쉼표로 구분한다.
* 객체(Object): 순서가 없는 이름/값 쌍의 집합으로, 이름(키)이 문자열이다.
* <code>[[null]]</code>: 빈 값으로, <code>null</code>을 사용한다.

=== 수(Number) ===
기본 자료형의 수는 다음과 같이 표현된다. C나 자바에서의 8진수와 16진수를 표현하는 방법은 지원되지 않는다.
* 정수
<syntaxhighlight lang="json">
74
1974
750
-114
-273
</syntaxhighlight>
* 실수([[고정 소수점]])
<syntaxhighlight lang="json">
3.14
-2.718
</syntaxhighlight>

* 실수([[부동 소수점|부동소수점]])
<syntaxhighlight lang="json">
1e4
2.5e12
3.4e+4
4.56e-8
5.67E+10
6.78E-5
</syntaxhighlight>

=== 문자열(String) ===
항상 큰 따옴표(")로 묶어야 하며, 그 안에는 유니코드 문자들이 나열된다. 유니코드 중 역슬래시(\)와 큰따옴표(")는 바로 사용할 수 없다. 역슬래시는 제어문자를 표현하기 위해 사용되며 다음과 같은 의미를 지닌다.
:\b 백스페이스
:\f 폼 피드
:\n 개행
:\r 캐리지 리턴
:\t 탭
:\" 따옴표
:\/ 슬래시
:\\ 역슬래시
:\uHHHH 16진수 네자리로되어 있는 유니코드 문자
<syntaxhighlight lang="json">
"1234"
"Love"
"O-matic"
"한글"
"\"JSON\""
</syntaxhighlight>

=== 배열(Array) ===
배열은 대괄호[]로 나타낸다. 배열의 각 요소는 기본 자료형이거나 배열, 객체이다. 각 요소들은 쉼표(,)로 구별된다. 각 요소가 나타나는 순서에 의미가 있다.
<syntaxhighlight lang="json" line="1">
 [10, {"v": 20}, [30, "마흔"]]
</syntaxhighlight>

=== 객체(Object) ===
객체는 이름/값 쌍의 집합으로, 중괄호{}를 사용한다. 이름은 문자열이기 때문에 반드시 따옴표를 하며, 값은 기본 자료형이다. 각 쌍들은 쉼표(,)로 구별된다. 각 쌍이 나오는 순서는 의미가 없다.
<syntaxhighlight lang="json">
 {"name2": 50, "name3": "값3", "name1": true}
</syntaxhighlight>

JSON 메시지 단위는 [[배열]]이나 [[객체]]이다. 위의 두 예는 JSON 메시지가 될 수 있다.

== 예제 ==
다음은 한 사람에 관한 정보를 갖는 JSON 객체이다.

키-값 쌍(이름:값)의 패턴으로 표현된다.
<syntaxhighlight lang="json" line="1">
 {
    "이름": "홍길동",
    "나이": 55,
    "성별": "남",
    "주소": "서울특별시 양천구 목동",
    "특기": ["검술", "코딩"],
    "가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"},
    "회사": "경기 수원시 팔달구 우만동"
 }
</syntaxhighlight>

== 장점 ==
* JSON은 텍스트로 이루어져 있으므로, 사람과 기계 모두 읽고 쓰기 쉽다.
* [[프로그래밍 언어]]와 [[컴퓨팅 플랫폼|플랫폼]]에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.
* [[자바스크립트]]의 문법을 채용했기 때문에 자바스크립트에서 <code>eval</code> 명령으로 곧바로 사용할 수 있다. 이런 특성은 자바스크립트를 자주 사용하는 웹 환경에서 유리하다. 그러나 실질적으로 <code>eval</code> 명령을 사용하면 외부에서 악성 코드가 유입될 수 있다. [[모질라 파이어폭스]] 3.5, [[인터넷 익스플로러]] 8, [[오페라 (웹 브라우저)|오페라]] 10.5, [[사파리 (웹 브라우저)|사파리]], [[구글 크롬]] 등 대부분의 최신 [[웹 브라우저]]는 JSON 전용 파서 기능을 내장하고 있으므로 이런 기능을 사용하는 것이 더 안전할 뿐만 아니라 빠른 방법이다.

== 같이 보기 ==
{{위키공용분류}}
* [[JSON 스트리밍]]
* 관련 포맷
** [[GeoJSON]]
** [[JSON-LD]]
** [[JSON-RPC]]
** [[JsonML]]
** [[S-표현식]]
** [[SOAPjr]]
** [[GBSON]] - annotation format of nucleic acid sequences ([[DNA]], [[RNA]])<ref>{{웹 인용|title=GBSON - A new annotation file format based on JSON|periodical=|publisher=|url=https://chlorobox.mpimp-golm.mpg.de/GBSON.html|format=|access-date=|archive-url=https://web.archive.org/web/20200604082713/https://chlorobox.mpimp-golm.mpg.de/GBSON.html|archive-date=2020-06-04|last=|date=|year=|language=en|pages=|quote=|url-status=dead}}</ref>
* 관련 바이너리 인코딩
** [[BSON]]
** [[CBOR]]
** [[MessagePack]]
** [[스마일 (데이터 교환 포맷)|스마일]] - JSON 기반
** [[UBJSON]]
** EXI4JSON (EXI for JSON)
* 구현체:
** [[잭슨 (API)|잭슨]]

== 각주 ==
<references />

== 외부 링크 ==
* {{공식 웹사이트}}
* [http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ECMA-404] — JSON 데이터 교환 포맷
* [https://jsonformatter.org JSON Formatter] — JSON 포매터
* [https://www.jsonformatting.com/ JSON Formatter Online] {{웨이백|url=https://www.jsonformatting.com/ |date=20210201151049 }} — JSON 온라인 포맷 머신
* [https://codebeautify.org/jsonvalidator JSON Validator] JSON 검사기

{{데이터 교환}}
{{ISO 표준}}
{{자바스크립트}}
{{전거 통제}}

[[분류:JSON| ]]
[[분류:데이터 직렬화 포맷]]
[[분류:자바스크립트]]
[[분류:마크업 언어]]
[[분류:2001년 도입]]
[[분류:Ajax]]
[[분류:오픈 포맷]]