json with c++ & c#

23
JSON with C++ & C#

Upload: gyeongwook-choi

Post on 29-Nov-2014

1.710 views

Category:

Education


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: JSON with C++ & C#

J S O N w i t h C + + & C #

Page 2: JSON with C++ & C#

JSON이란 Array형식으로 구조화된 데이터를 저장하는 형식으로써

XML과 비슷하다고 할 수 있다.

Page 3: JSON with C++ & C#

XML보다 크기가 작아서 네트워크로 송수신할 때 유리하다.

주로 웹서비스에서 많이 사용되었으나 최근 모바일 게임 등을 통해 게임에서도 사용되기 시작

Page 4: JSON with C++ & C#

JSON

<menu id="file" value="File"><popup>

<menuitem value="New" onclick="CreateNewDoc()" /><menuitem value="Open" onclick="OpenDoc()" /><menuitem value="Close" onclick="CloseDoc()" />

</popup></menu>

{ "menu": {

"id": "file","value": "File","popup": {

"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"},{"value": "Close", "onclick": "CloseDoc()"}

]}

}}

XML

Page 5: JSON with C++ & C#

DATA TYPE

Page 6: JSON with C++ & C#

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

}}

Page 7: JSON with C++ & C#

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”

]

Page 8: JSON with C++ & C#

String

문자열이고, 주의할 점은 “ ”로 감싸야 한다.

Number

int, float, real이 가능하다.

기타 자료형에는 true, false, null이 있다.

Page 9: JSON with C++ & C#

R A P I D J S O N

Page 10: JSON with C++ & C#

C++의 json 라이브러리

JSONKit, jsonme--, ThorsSerializer, JsonBox, jvar, jsoncpp, zoolib, JOST,

CAJUN, libjson, nosjob, rapidjson, jsoncons, JSON++, SuperEasyJSON, Casablanca

http://json.org/json-ko.html

Page 11: JSON with C++ & C#

rapidjson의 특징은 빠른 속도에 있으며 MIT License 이다.

공식 홈페이지는 아래와 같다.

https://code.google.com/p/rapidjson/

Page 12: JSON with C++ & C#

사용 법은 공식 홈페이지에서 소스를 받아 압축을 풀고,

include\rapidjson 폴더 안의 document.h를 include함으로써 사용할 수 있다.

Page 13: JSON with C++ & C#

#include "rapidjson/document.h"#include <cstdio>

int main() {// 파싱할 문자열을 만든다.

const char json[] = "{ \"hello\" : \"world\" }";

// 파싱한 데이터를 관리할 document 객체 생성

rapidjson::Document d;// 앞에서 만든 소스를 파싱해서 새로 생성한 객체에 그 결과를 담는다.

d.Parse<0>(json);

// 저장된 데이터에서 원하는 데이터를 접근해서 가져온다.

printf("%s\n", 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() 등이 있다.

Page 14: JSON with C++ & C#

// JSON true나 false 모두 bool이므로 두 가지의 경우에는 true를 반환한다. IsTrue()도 가능하다.

assert( document["t"].IsBool() );printf( "t = %s\n", 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 = %d\n", 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] = %d\n", 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

]}

오른쪽과 같은 작업을 할 수 있다.

Page 15: JSON with C++ & C#

#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%s\n--\n", strbuf.GetString());

return 0;}

Page 16: JSON with C++ & C#

J S O N f o r . N E T

Page 17: JSON with C++ & C#

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

Page 18: JSON with C++ & C#

JSON for .NET

http://csjson.sourceforge.net/

Page 19: JSON with C++ & C#

사용 법은 공식 홈페이지에서 소스를 받아 압축을 풀고,

System.Net.Json.dll을 Add Reference 해서 사용

Page 20: JSON with C++ & C#

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));

}

Page 21: JSON with C++ & C#

// 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", "[email protected]"));collection.Add(new JsonBooleanValue("HideEmail", true));

// indentation이 포함된 형태로 설정JsonUtility.GenerateIndentedJsonText = true;

// string으로 바꿀 때는 아래와 같이collection.ToString();

// FirstName을 얻으려면 “FirstName”이라는 키로 접근해서 값을 얻은 다음 캐스팅한다.(String)collection[“FirstName"].GetValue();

Page 22: JSON with C++ & C#

http://jsonlint.com/

JSON 형태가 제대로 된 것인지 확인할 수 있는 사이트

Page 23: JSON with C++ & C#

참고자료

https://code.google.com/p/rapidjson/

http://www.json.org/

http://kimstar.pe.kr/blog/74