JavaScript Object Notation[1]
1 개요
일반적으로 서버에서 클라이언트로 데이터를 보낼 때 사용하는 양식. 클라이언트가 사용하는 언어에 관계 없이 통일된 데이터를 주고받을 수 있도록, 일정한 패턴을 지닌 문자열을 생성해 내보내면 클라이언트는 그를 해석해 데이터를 자기만의 방식으로 온전히 저장, 표시할 수 있게 된다.
과거, 웹 초기 시절부터 사용되어온 양식이 그 유명한 XML이나, 헤더와 태그 등의 여러 요소로 가독성이 떨어지고 쓸데없이 용량을 잡아먹는다는 단점이 항상 지적되어 왔다. 이에 대응해 간결하고 통일된 양식으로 각광을 받고 있는 것이 JSON이다. 제이슨이라고 읽으며, 13일의 금요일과는 무관.
2 구조
<syntaxhighlight lang="json" line="1">
{
"보컬로이드": ["카이토","메이코","하츠네 미쿠","카가미네 린","메구리네 루카"
],"노래": {"루카": "루카루카★나이트 피버","미쿠": "미쿠미쿠하게 해줄게♪"
}
}
</syntaxhighlight>
예제가 뭔가 이상해
[]안의 것은 순서가 있는 배열[2], {}안의 것은 속성명(흔히 이름표라고 한다)이 있는 객체를 의미하며, 객체 안에 객체를 넣을 수도 있어서 XML처럼 복잡한 구조 또한 표현이 가능하다! 더 구체적으로 지원하는 값은 {}로 표기되는 객체, []로 표기되는 배열, 문자열, 숫자, 불리언, null의 6가지가 전부다. 또한 null의 존재에서 알 수 있듯, JSON은 JavaScript 이외의 언어에서 사용될 상황을 다분히 고려하고 있다.[3]
3 특징
그래도 표면적으로 W3C의 표준은 XML인데, 그것과는 무관하게 JSON은 2009년 말 Ecma에 의해 ECMAScript5에서 스크립트 엔진의 기본 기능으로 내장되어 버렸기 때문에 새롭게 출시되는 브라우저들 기준에서는 DOM을 통해 XML파싱하는 것보다 JavaScript 엔진에서 JSON을 메모리로 받는 쪽이 성능으로보나 트래픽으로보나 훨씬 더 나은 선택이 되어버렸다. 그런관계로 웹에서 XML은 본격 계륵화가 진행중...
기본적으로 JavaScript 객체표기법의 부분집합 이기 때문에 웹 브라우저 레벨에서 참 쉽게 해석할 수 있으며, 모양과 규칙 자체가 단순한 관계로 다른 언어에서 구현하기도 쉽다. 그래서 오늘날 사용되는 거의 모든 프로그래밍 언어에서 사용가능하다. 이러한 지원에 힘입어 Ajax 구현에도 상당히 빈번하게 쓰인다.
엄청나게 단순하지만 유연한 표기법이기 때문에 언어와 독립된 표준적인 데이터 표기법으로 확산되고 있다. 본래의 범위를 넘어서 바이너리 데이터 표기용으로 마개조한 BSON[4]도 있으며, NoSQL DB중 DocumentDB들에서는 그냥 표준 표기법으로 취급되고 있다. 최근에는 NoSQL뿐만 아니라 관계형DB인 PostgreSQL에서도 지원하기 시작.
그러나 확산되고 있다고 해도 어디까지나 웹 브라우저가 주가 되는 환경, 특히 사용자에게 보여주는 HTML 과 이를 실시간으로 가공하는 JavaScript가 연동하는 환경 위주로 퍼지고 있으며, 그렇지 않은 곳에서는 여전히 XML이 사용된다. XML파서도 다양한 플랫폼에 구현돼있고 XML이란 놈이 딱히 무슨 결함이 있는 것도 아니며 결정적으로 XML에는 스키마(Schema)가 있어서 데이터의 무결성을 검증할 수 있다. JSON은 데이터의 무결성을 검증하는 역할을 전적으로 그걸 사용하는 측에 떠맡긴다.
그리고 JSON도 적용되는 곳이 늘어남에 따라 XML과 같이 valid 한 검증뭐?이 필요해졌으며, Namespace 문제가 발생하는 경우가 늘고 있다. 이를 극복하기 위해 JSON-Schema, JSON-LD(JSON Linking Data) 같은 것이 등장하고 있다. 대항마라더니 결국 XML을 그대로 따라가고 있다.
그러나 대응책으로 제시된 JSON 스키마는 현재 거의 쓰이지 않고 있다. 웹이라는 환경 특성상 데이터가 좀 잘못 들어간다고 해서 특별히 큰일이 나는 게 아니기 때문이다. 게다가 데이터가 잘못 들어가면 프로그램이 강제 종료한다거나 하는 크리티컬한 응용에서는 그냥 XML을 사용하고 있다. JSON은 콤마가 누락되거나 중괄호가 잘못 닫히는 등의 오염에 아주 취약하다. XML은 SAX파서를 사용해서 이런 데이터 오류를 바로잡고 재동기화가 쉽다.
Unity3D 엔진에서 플러그인으로 시리얼라이저와 디시리얼라이저를 제공하기 시작하면서 모바일 플랫폼에서도 대거 사용되기 시작한다. CSV등 기존 포멧에 비해 태그에 의한 데이타 확장과 변형이 용이하고 과거에 비해 데이타 사용량이 자유롭기 때문에 이런 현상이 가속화 되고 있다. (단적인 예로 많은 게임 데이터들이 제이슨으로 되어있다.)
서브라임 텍스트에서는 환경 설정 파일에 JSON을 사용하고 있다.
[1]에서 표기법과 언어별 지원 라이브러리를 볼 수 있다.
참고 : [2]