1. 개요
- JSON : JavaScript Object Notation
- lightweight data 교환 형식.
- 사람이 읽고 쓰기 쉬움.
- 기계가 파싱하고 생성하기 쉬움.
2. 일반사항
- The official Internet media type for JSON : application/json
- 확장자 : .json
- Structured dat를 네트워크 상에서 주고 받을때 주로 사용 (주로 Ajax 등에서)
- subset of Javascript : specifically, Standard ECMA-262 3rd Edition?December 1999
- json.org : JSON 바인딩에 대한 다양한 자료 제공
- Yahoo / Google : JSON 지원
3. 특징
- JavaScript의 Array 문법으로 데이터 구조를 기술하는 방법으로 XML이 가지는 유연성과 구조적 데이터 표현기능을 확보하면서, XML이 가진 오버헤드를 줄이는 방법으로 사용되고 있다.
- 클라이언트에서는 JavaScript의 eval()로 객체로 만들어 사용, 별도의 파싱 절차가 필요없음 (클라이언트에서 처리 퍼포먼스 높음)
- 서버측 JSON 파싱 모듈은 거의 모든 언어별로 지원(Java, C, ActionScript, Delphi, Ruby, Perl, CAMAL등)
- 클라이언트/서버측 모두 송신은 문자열 조립으로 처리
- XML이 표현하는 구조적인 정보 모두 표현가능
- 송수신 데이터로 XML를 사용하는 것에 비해 훨씬 빠르고, 간편하다.
- language-independent text format, 대부분의 브라우저, 언어에서 지원된다.
- 주로 XmlHttp 로 script text를 수신하여 다음과 같은 코드로 객체로 build 한다. (예제 : myObject = eval("return " + json_data); )
4. 데이타 타입
1) Object
- 중괄호({})로 시작하고 끝남
- member : 문자열과 값으로 구성되어 있고 콜론( 으로 구분, 각 멤버들은 콤마(,)로 구분
- value : 값은 object, string, number, array, true, false, null 사용 가능


2) String
- 문자열은 쌍따옴표(")로 둘러 쌓여야 함
- Unicode character 또는 일반적인 escape 문자(", , /, b, f, n, r, t, u four-hex-digits)를 포함한다.

3) Number
- integer, real or floating point

4) Array
- an ordered sequence of values
- 대괄호([])로 시작하고 끝나며 각 값은 콤마(,)로 구분

5) true
6) false
7) null
5. 예제 #1
1) 사람을 나타내는 JSON 예제
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
"212 555-1234",
"646 555-4567"
]
}2) 설명
- 성,이름,주소,전화라는 각 object는 Key:Value로 구성
- 각 Object는 ,로 구분
- 이름의 Value는 String
- 주소의 Value는 Object
- 전화의 Value는 배열
3) 사용법
- var p = eval('(' + contact + ')');
- p.firstName, p.address.city, p.phoneNumbers[0]
6. 예제 #2
1) 그림을 나타내는 JSON 예제
{
"Image": {
"Width":800,
"Height":600,
"Title":"View from 15th Floor",
"Thumbnail":{
"Url":"http://scd.mm-b1.yimg.com/image/481989943",
"Height": 125,
"Width": "100"
},
"IDs":[ 116, 943, 234, 38793 ]
}
}2) 설명
- 출처 : rfc4627
- 예제에서 Image는 최상위 object이고 모든 다른 데이터들은 이 object의 멤버.
- Width, Height, Title는 숫자와 문자열 데이타를 포함하고 있는 기본적인 멤버.
- Thumbnail은 Url, Height, Width를 멤버로 포함하고 있는 중첩 object.
- IDs는 숫자 값을 가지고 있는 array.
- Url 문자열 값에서 슬래쉬 가 escape 됨에 주의
7. 예제 #3
1) 메뉴를 나타내는 JSON 예제
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}2) 위와 동일한 XML
<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()" />
<menuitem value="Open" onclick="OpenDoc()" />
<menuitem value="Close" onclick="CloseDoc()" />
</popup>
</menu>8. PHP
- 5.2버전부터 json_encode 함수 지원
서버에서 JSON 포멧으로 리턴하는 예제
<?php
$popups = array();
$popups[] = 'This is the first popup';
$popups[] = 'This is the second popup';
$return['popups'] = $popups;
$return['result'] = 'success';
// output correct header
$isXmlHttpRequest = (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) ?
(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false: false;
($isXmlHttpRequest) ? header('Content-type: application/json') : header('Content-type: text/plain');
echo json_encode($return)
?>ob_XXX 함수를 사용하여 JSON 포멧을 리턴하는 예제
<?php
// start capturing output buffer
ob_start();
?>
<p>An HTML paragraph</p>
<?php
// Flush any HTML output
$return['html'] = ob_get_contents();
ob_end_clean();
$return['result'] = 'success';
header('Content-type: application/json');
echo json_encode($return);
?>9. C#
참고자료
- JSON_checker : http://www.raboof.com/projects/jsonchecker/
- Jayrock : http://jayrock.berlios.de/
- Json.NET - LINQ to JSON : http://james.newtonking.com/projects/json-net.aspx
- JSONSharp : http://code.google.com/p/jsonsharp/
- LitJSON : http://litjson.sourceforge.net/
- JSON for .NET : http://sourceforge.net/projects/csjson
- JsonFx : http://jsonfx.net/download/
- JsonExSerializer : http://code.google.com/p/jsonexserializer/
Serialize to String
MyClass myClass = new MyClass();
string result = serializer.Serialize(myClass);Serialize to TextWriter
MyClass myClass = new MyClass();
TextWriter writer = new TextWriter(new FileStream("somefile.jsx", FileMode.Create));
serializer.Serialize(myClass, writer);
writer.Close();Deserialize from String
string result = ... Populate the string with previously serialized content
MyClass myClass = (MyClass) serializer.Deserialize(result);Deserialize from TextReader
TextReader reader = new TextReader(new FileStream("somefile.jsx", FileMode.Open));
MyClass myClass = (Myclass) serializer.Deserialize(reader);
reader.Close();JsonExSerializer 비교 결과
- 제 노트북에서의 시험 결과임. Pentium M 1.6GHz, 1GB RAM
-----------------------------------------------------
Serialization Performance Test
Serializer Type: BinarySerializer
File Size : 19128 bytes
Iterations : 2500
Object Count : 100
Total Time : 10472ms
Avg Time : 4.189ms per iteration
-----------------------------------------------------
Deserialization Performance Test
Serializer Type: BinarySerializer
File Size : 19128 bytes
Iterations : 2500
Object Count : 100
Total Time : 4456ms
Avg Time : 1.782ms per iteration
-----------------------------------------------------
Serialization Performance Test
Serializer Type: XmlSerializer
File Size : 31565 bytes
Iterations : 2500
Object Count : 100
Total Time : 9559ms
Avg Time : 3.824ms per iteration
-----------------------------------------------------
Deserialization Performance Test
Serializer Type: XmlSerializer
File Size : 31565 bytes
Iterations : 2500
Object Count : 100
Total Time : 3981ms
Avg Time : 1.592ms per iteration
-----------------------------------------------------
Serialization Performance Test
Serializer Type: JsonExSerializer
File Size : 31989 bytes
Iterations : 2500
Object Count : 100
Total Time : 16033ms
Avg Time : 6.413ms per iteration
-----------------------------------------------------
Deserialization Performance Test
Serializer Type: JsonExSerializer
File Size : 31989 bytes
Iterations : 2500
Object Count : 100
Total Time : 22302ms
Avg Time : 8.921ms per iteration
-----------------------------------------------------9. Javascript
- http://www.json.org/json.js - 최신버전 json.js 다운받기
- http://www.json.org/json2.js - JSON2 릴리즈. (Object.prototype 에 속성을 추가하지 않도록 수정되었음)
10. 출처
- http://en.wikipedia.org/wiki/JSON
- http://www.0bin.net/moniwiki/wiki.php/Page_AJAX/Doc/03_JSON
- http://www.json.com
- http://json.org/
- http://www.ietf.org/rfc/rfc4627.txt?number=4627
- http://2.0business.kr/wiki/wiki.php/JSON
- http://steelleg.tistory.com/169
11. 첨부
JsonExSerializer-2.0.0.100.zip
12. 기타
- 관련글 : JSON for .NET (http://kimstar.pe.kr/blog/365)



많이 답답했었는데 여기 보고 많이 배웠습니다. 고맙습니다~
도움이 되었다니 저도 기쁘네요. 좀 오래된 자료라 최근 동향 위주로 다시 한번 살펴볼 필요도 있을듯하네요.
자료를 정말 이해하기 쉽게 잘 포스팅해주셔서
감사드리며 앞으로 자주 들리겠습니다 ^^;
예전인데 도움이 되셨다니 기쁘네요. 자주 찾아주세요. ^^
Syntax diagram을 프로그래밍 언어론 수업시간 이후 처음 봤습니다. 실제 예제를 보니 낯서네요. ^^
잘 배워갑니다.
저는 BNF보다는 Syntax Diagram이 문법을 직관적으로 읽기 쉬운듯하네요. 자주 놀러오세요. ^^
좋은내용 감사합니다. 아직 공부하고 있는데 매우 도움이 되었습니다.
공부하시는데 도움이 되었으면 좋겠네요.
감사합니다. ^^
좋은 정보 잘봤습니다. 감사합니다~
유용한 정보가 되었기를 바랍니다.
감사합니다. 퍼갈께용
크리에이티브 커먼즈 라이센스에 따라 출처를 남기고 사용해 주시기 바랍니다.
유용한 자료가 되었기를 바랍니다. ^^