JSON (JavaScript Object Notation)

Posted in 모바일/Javascript // Posted at 2010. 10. 6. 11:34
728x90

JSON은 인터넷을 통해 응용프로그램간 데이터를 주고 받는 규칙 즉 데이터 포맷을 일컫는다

'이슨' 이라고 발음하는데 우연찮게도 '13일 밤의 금요일' 의 누군가와 이름이 같다 ㅎㅎ
당연하겠지만, 그 제이슨과는 아무런 연관이 없으며 데이터 포맷을 위한 표기법이 자바스크립트 객체 표기
방식에 근거를 두어
전체 이름이 JavaScript Object Notation 며 그 약자가 JSON 이다

JSON 은 Douglas Crockford 라는 미국의 개발자에 의해 탄생했으며 JSON 을 가장 잘 설명해 놓은 곳은 역시 JSON 공식 웹 사이트이다. 다음의 JSON 사이트에서 JSON의 모든 것을 알 수 있다
=> http://www.json.org/ (한글판: http://json.org/json-ko.html)

그리고 위키백과에도 JSON 을 꽤 적절하게 잘 설명하고 있다
=> http://ko.wikipedia.org/wiki/JSON

인터넷을 통한 원격 통신간 데이터 교환 포맷인, JSON 은 요즘 뜨는 최신 기술이 아니다.
이미 수 년전부터 곳곳에서 이를 이용해 왔으며 나의 경우 3년전인 2007년경에 처음 접하게 되었다
웹의 비동기 통신기법인 Ajax 의 등장시기와 유사한 2005년경에 본격적으로 이름이 알려지기 시작한 것 같으며 현재 트위터와, 오픈 API 와 같은 경량성, 상호연동성, 쉽고 편리한 API를 중시하는 서비스들에 많이 적용되고 있는 추세이다

그리고 JSON 이 비록 자바스크립트 구문형식을 따르기는 하지만 그 자체로 하나의 독립적인 체계로써 특정
언어나 플랫폼에 종속되지 않으며 C#, Java, ASP, PHP, C, C++ 등의 다양한 언어에서 JSON 포맷을 위한 파서들이 제공되고 있다. 


인터넷 데이터 교환 포맷
인터넷 특히 웹을 통한 데이터 교환은 JSON 이전에도 존재했었다.
가장 원시적인 방법이 일반 텍스트를 이용하는 것이었다. 단일 값은 물론 복수의 값도 전달가능 일반 텍스트로 전달하곤 했었는데, 대체로 다음과 같이 구분자를 기준으로 텍스트 포맷을 주고 받는 형태였다

일반 텍스트 포맷: "name=박종명 || email=mkex@naver.com || age=36"
전체 구분자로 '||'를 이용하고 키,값 구분자로 '=' 를 이용하여 데이터를 정의했으며 수신하는 측에서는 구분자를 기준으로 문자열을 분리하여 그 의미를 해석하곤 했다

척박한 당시 상황에서는 일반텍스트 포맷은 꽤 많은 곳에서 이용되었으며 대략 만족하기도 했었다
그러나 구분자 역시 문자이기 때문에 전달하고자 하는 데이터 자체와 충돌할 수 있었고 배열 형태와 같은
복수 집합 자료를 정의하기에는 어울리지 않는 포맷이었다

---

다음으로 각광 받은 포맷이 XML 이다. XML 자체가 데이터 정의에 매우 적합한 언어이기에 아주 훌륭한 포맷이었다. 다음에서 보는바와 같이 각 요소는 정확한 의미의 태그와 연결될 수 있으며 집합자료정의도 쉽게 할 수 있다. 또한 요소의 attribute 를 이용하면 데이터 타입이나 제약사항과 같은 같은 추가 정보도 얼마던지 정의할 수 있어 데이터 정의에 매우 적합한 형태이다
<user>
  <name>박종명</name><email>mkex@naver.com</email>
  <name>홍길동</name><email>xxxxxxx@naver.com</email>
  ...
</user>

이와같이 XML은 데이터에 의미를 부여하기 위해서는 그 어떤 포맷보다 훌륭하지만 매번 열고 닫아야 하는 태그 쌍은 데이터의 크기를 증가시키는 원인이 되기도 하며 XML을 파싱할 때 브라우저 호환성도 신경쓰이 부분이었다
--

이제 JSON의 등장이다. JSON 공식 사이트에서 JSON을 소개하는 문구를 가져와 본다
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write

JSON은 텍스트 포맷보다 훨씬 효과적으로 데이터를 구조화 할 수 있다
JSON은 XML 포맷보다 가볍다. 그리고 가독성이 좋다
바꿔 말하면, JSON 은 텍스트만큼 가볍고 XML만큼 구조적이다
그리고 JSON 은 자바스크립트에 근간하기 때문에 웹 환경에 더욱 적합하다

Ajax, 웹 Open API 등 웹 환경에 JSON 이 대세인 이유가 조금은 설명되었을 것이다


JSON 사용하기
JSON 은 그 장점에 비해 사용법은 매우 심플하다
기본적으로 알아 둬야 할 것은 JSON은 (규칙이 있는) 텍스트 포맷이며 유니코드 인코딩이란 점이다

그리고 가장 기본적인 형태는 중괄호 안에 정의된 키:값 형태이다.
다수의 객체를 정의하기 위해서는[](대괄호)를 사용하며 배열요소는 ,(꼼마)로 구분한다.
JSON으로 숫자, 문자, 참/거짓, null, 객체, 배열등을 표현할 수 있다

다음의 코드는 id, age, blog 라는 속성을 가진 회원(user) 정보를 JSON 포맷으로 단일 객체와 객체 배열로
정의하고 자바스크립트로 핸들링 하는 예이다

var user = {"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"} 
alert(user.id); // mkex 출력

var objectArray = {
               users: [
                 {"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"},
                 {"id":"mkex2", "age":36, "blog":"http://m.mkexdev.net"}
               ]                 
             }
alert(objectArray.users[1].id); //mkex2 출력



그리고 JSON이 자바스크립트 구문에 근간하기 때문에 다음과 같이 eval 을 통해 일반 문자열을 JSON 객체로 변환할 수 있다. 대부분 시나리오에서 JSON 객체를 문자열로 전송하고 수신측에서는 이를 JSON객체로 변환
하여 사용하게 된다

var userString = '{"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"}'
var userJSON = eval("(" + userString + ")");
alert(userJSON.age); //36 출력

 
마이크로소프트 닷넷과 JSON
여러 언어들에서 JSON 포맷을 지원하기 위한 API들이 제공된다
닷넷을 사랑(?)하는 필자가 가장 먼저 언급할 것 역시 닷넷의 JSON 지원이다
닷넷 프레임워크에서는 System.Runtime.Serialization.Json.DataContractJsonSerializer 라는 클래스를 통해
닷넷 객체를 JSON 객체로 변환하거나 JSON 객체를 닷넷 객체로의 변환을 지원한다


다음의 블로그에서 자세한 정보를 얻을 수 있으니 참고 바란다
http://blog.naver.com/dotnethelper/60103536438

그리고 Json.NET 라이브러리도 있으니 참고 바란다

다양한 언어들을 위한 JSON 파서
JSON이 워낙 유명(?)하기에, 닷넷과 같이 프레임워크 차원에서 JSON 을 지원하는 경우도 있고 Json.NET과
같이 외부 라이브러리로 존재하기도 한다


http://www.json.org 에서는 각종 언어별로 제공되는 JSON 파서의 링크를 제공해 준다
상황에 맞는 라이브러리를 참고하기 바란다

참고로 자바스크립트의 eval 을 통한 변환은 예기치 않은 보안 문제가 발생할 수 있으므로
이들 파서의 사용은 더욱 권장된다