6. Object
{ 로 시작해서 } 로 끝남
key – value 쌍으로 이루어진다.
key는 string만 가능
value는 object, string, number, array, true, false, null 이 가능
예 :
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
}
}
7. Array
흔히 알고 있는 배열과 같다고 할 수 있다.
[ 로 시작해서 ] 로 끝난다.
index를 통해서 접근하고, 저장되는 데이터의 타입은 서로 다를 수 있다.
value는 object, string, number, array, true, false, null 이 가능
예 :
[
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"},
5,
null,
“Hi”
]
8. String
문자열이고, 주의할 점은 “ ”로 감싸야 한다.
Number
int, float, real이 가능하다.
기타 자료형에는 true, false, null이 있다.
11. rapidjson의 특징은 빠른 속도에 있으며 MIT License 이다.
공식 홈페이지는 아래와 같다.
https://code.google.com/p/rapidjson/
12. 사용 법은 공식 홈페이지에서 소스를 받아 압축을 풀고,
includerapidjson 폴더 안의 document.h를 include함으로써 사용할 수 있다.
13. #include "rapidjson/document.h"
#include <cstdio>
int main() {
// 파싱할 문자열을 만든다.
const char json[] = "{ "hello" : "world" }";
// 파싱한 데이터를 관리할 document 객체 생성
rapidjson::Document d;
// 앞에서 만든 소스를 파싱해서 새로 생성한 객체에 그 결과를 담는다.
d.Parse<0>(json);
// 저장된 데이터에서 원하는 데이터를 접근해서 가져온다.
printf("%sn", d["hello"].GetString());
return 0;
}
// world가 출력된다.
>>> world
d.Parse<0>(json);
<0>은 파싱하는 옵션을 기본값으로 사용하겠다는 의미
d["hello"].GetString()
[ ]는 접근하려는 데이터의 d안에서의 위치
만약 [ ] 연산자 앞의 대상이 object라면 문자열(“ ” 형식의)을
이용해서 접근할 수 있고, array라면 index를 통해서 접근한다.
주의 할 점은 index로 접근할 때는 int를 바로 사용할 수는 없으며
rapidjson::SizeType으로 index를 캐스팅해주어야 한다.
예제 코드에서 d는 { }로 감싸진 object 이므로 문자열을 통해 접근
뒤의 .GetString()은 접근한 데이터를 어떤 타입으로 리턴할지 결정한다.
이외에도 GetInt(), GetInt64(), GetBool(), GetDouble() 등이 있다.
14. // JSON true나 false 모두 bool이므로 두 가지의 경우에는 true를 반환한다. IsTrue()도 가능하다.
assert( document["t"].IsBool() );
printf( "t = %sn", document["t"].GetBool() ? "true" : "false“ );
// numbe는 JSON type이므로 IsInt()로 좀 더 명확하게 알아볼 수 있다.
// 이 경우에는 IsUint() / IsInt64() / IsUInt64() 모두 true를 반환한다.
assert( document["i"].IsNumber() );
assert( document["i"].IsInt() );
// ( int )document[ “I” ]; 로 캐스팅도 가능하다.
printf( "i = %dn", document["i"].GetInt() );
// 접근한 데이터를 캐스팅 하지 않고, Value라는 자료형에 바로 담을 수도 있다.
const Value& a = document["a"];
assert( a.IsArray() );
// array의 데이터에 접근하는 index i는 SizeType이라는 자료형을 사용한다.
for ( SizeType i = 0; i < a.Size(); i++ )
printf( "a[%d] = %dn", i, a[i].GetInt() );
// 위의 예제에서 document["a"]라는 array 안의 특정 값만 필요하다면 다음과 같이 사용도 가능
// document["a"][SizeType(index)].GetInt();
rapidjson::Document document의
데이터가 다음과 같을 때
{
"hello": "world",
"t": true ,
"f": false,
"n": null,
"i": 123,
"pi": 3.1416,
"a": [
1,
2,
3,
4
]
}
오른쪽과 같은 작업을 할 수 있다.
15. #include "rapidjson/document.h“
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <cstdio>
...
/*
json data document를 string으로 변환
*/
// StringBuffer로 Writer를 만들어서 document에 등록
rapidjson::StringBuffer strbuf;
rapidjson::Writer<StringBuffer> writer(strbuf);
document.Accept(writer);
// StringBuffer에 .GetString()으로 변환된 string data를 얻을 수 있음
printf("--n%sn--n", strbuf.GetString());
return 0;
}
17. C#의 json 라이브러리
fastJSON, JSON_checker, Jayrock, Json.NET - LINQ to JSON, LitJSON, JSON for .NET,
JsonFx, JSON@CodeTitans, How do I write my own parser?, JSONSharp, JsonExSerializer,
fluent-json, Manatee Json, FastJsonParser
http://json.org/json-ko.html
19. 사용 법은 공식 홈페이지에서 소스를 받아 압축을 풀고,
System.Net.Json.dll을 Add Reference 해서 사용
20. using System;
using System.Collections.Generic;
using System.Text;
namespace Example
{
using System.Net.Json;
class Program
{
const string jsonText =
"{"+
" "FirstValue": 1.1,"+
" "SecondValue": "some text"," +
" "TrueValue": true" +
"}";
static void Main(string[] args)
{
// parser를 하나 만들어서 오브젝트에
// string data를 parser로 읽은 데이터를 저장
JsonTextParser parser = new JsonTextParser();
JsonObject obj = parser.Parse(jsonText);
// 이렇게 생성된 데이터는 현재 indentation을
// 포함한 상태이므로 이를 지우려면
JsonUtility.GenerateIndentedJsonText = false;
// json object의 값을 순회하면서 열거
foreach (JsonObject field in obj as JsonObjectCollection)
{
string name = field.Name;
string value = string.Empty;
string type = field.GetValue().GetType().Name;
// 출력을 위해 타입 확인 후, string으로 캐스팅
switch(type)
{
case "String":
value = (string)field.GetValue();
break;
case "Double":
value = field.GetValue().ToString();
break;
case "Boolean":
value = field.GetValue().ToString();
break;
default:
// 일단 arrays나 objects는 예외로 처리
throw new NotSupportedException();
}
Console.WriteLine("{0} {1} {2}",
name.PadLeft(15), type.PadLeft(10), value.PadLeft(15));
}
21. // JSON data 생성하기
// JsonObjectCollection을 하나 생성
JsonObjectCollection collection = new JsonObjectCollection();
// collection 사용하듯이 값을 추가
collection.Add(new JsonStringValue("FirstName", "Pavel"));
collection.Add(new JsonStringValue("LastName", "Lazureykis"));
collection.Add(new JsonNumericValue("Age", 23));
collection.Add(new JsonStringValue("Email", "me@somewhere.com"));
collection.Add(new JsonBooleanValue("HideEmail", true));
// indentation이 포함된 형태로 설정
JsonUtility.GenerateIndentedJsonText = true;
// string으로 바꿀 때는 아래와 같이
collection.ToString();
// FirstName을 얻으려면 “FirstName”이라는 키로 접근해서 값을 얻은 다음 캐스팅한다.
(String)collection[“FirstName"].GetValue();