Post List

레이블이 json인 게시물을 표시합니다. 모든 게시물 표시
레이블이 json인 게시물을 표시합니다. 모든 게시물 표시

2016년 5월 21일 토요일

Newtonsoft.Json 사용하기 : C# (.Net) 에서 JSON 생성 및 Parsing 하기

Newtonsoft.Json 사용법

C# 에서 JSON document를 다루기 위해 가장 많이 사용되는 것은 Newtonsoft.Json입니다. nuget manager에서 JSON으로 검색시 가장 먼저 나옵니다. 그만큼 많이 사용되며, 사용법 또한 간단합니다.

1. 설치 및 namespace

솔루션 탐색기 (Solution Explorer)에서 마우스 우클릭 하신뒤 Manage nuget packages...을 누르셔서 Browse 탭에서Newtonsoft.Json을 검색하셔서 Install을 누르면 됩니다.
그림 MVC
다른 방법으로는 도구(Tools) -> Nuget package manager -> Package Manager Console 로 가셔서 아래와 같이 입력하시면 됩니다.
PM> Install-Package Newtonsoft.Json
사용시 소스코드에서 아래의 namespace를 추가해 주시면 됩니다.
using Newtonsoft.Json.Linq;

2. 간단한 특징 설명

2개의 Object를 이용해서 사용하시면 됩니다.
  • JObject : JSON Object 입니다.
    • JObject 자체가 name값을 가질 수는 없습니다.
    • (key, value) pair 들을 가질 수 있습니다.
    • key : string 값입니다.
    • value : JToken 타입이며 대부분의 premitive type들과 DateTime, TiemSpan, Uri 값을 직접대입 가능하며, 기타 Object도 입력이 가능합니다.
      • value에 다른 JObject나, JArray를 넣을 수 있습니다.
  • JArray : JSON Array 입니다.
    • JObject와 특징이 거의 비슷하나 key 없이 value 들을 가지고 있습니다.
즉, JObject나 Jarray 자체는 name을 가질 수 없으나, 다른 JObject에 value로 소속될 경우에는 key값을 가져야 하며, 다른 JArray에 소속될 경우에는 key값 없이 입력됩니다

3. JObject 사용법

너무나 간단하기 때문에 별도 설명은 필요 없을듯 합니다.
  • 생성 : new JObject()
  • Element 추가 : .add(key, value)
바로 예제를 보도록 하겠습니다.

3.1 Element 추가

3.1.1 기본적인 사용법

var json = new JObject();
json.Add("id", "Luna");
json.Add("name", "Silver");
json.Add("age", 19);

Console.WriteLine(json.ToString());
{
  "id": "Luna",
  "name": "Silver",
  "age": 19
}

3.1.2 JSON 형식의 문자열로 생성

var json2 = JObject.Parse("{ id : \"Luna\" , name : \"Silver\" , age : 19 }");
json2.Add("blog", "devluna.blogspot.kr");

Console.WriteLine(json2.ToString());
{
  "id": "Luna",
  "name": "Silver",
  "age": 19,
  "blog": "devluna.blogspot.kr"
}

3.1.3 다른 class Object로부터 생성

User u = new User { id = "SJ", name = "Philip", age = 25 };
var json3 = JObject.FromObject(u);

Console.WriteLine(json3.ToString());
{
  "id": "SJ",
  "name": "Philip",
  "age": 25
}

3.1.4 무명형식으로 생성

var json4 = JObject.FromObject(new { id = "J01", name = "June", age = 23 });

Console.WriteLine(json4.ToString());
{
  "id": "J01",
  "name": "June",
  "age": 23
}

3.1.5 다른 JObject를 Element로 추가

var json5 = JObject.Parse("{ id : \"sjy\" , name : \"seok-joon\" , age : 27 }");
json5.Add("friend1", json);
json5.Add("friend2", json2);
json5.Add("friend3", json3);
json5.Add("friend4", json4);

Console.WriteLine(json5.ToString());
{
  "id": "sjy",
  "name": "seok-joon",
  "age": 27,
  "friend1": {
    "id": "Luna",
    "name": "Silver",
    "age": 19
  },
  "friend2": {
    "id": "Luna",
    "name": "Silver",
    "age": 19,
    "blog": "devluna.blogspot.kr"
  },
  "friend3": {
    "id": "SJ",
    "name": "Philip",
    "age": 25
  },
  "friend4": {
    "id": "J01",
    "name": "June",
    "age": 23
  }
}

3.2 Element값 사용하기

3.2.1 Element값 읽기

[ ] 연산자에 key값을 넣어주면 해당 value를 얻을 수 있습니다.
var json4_name = json4["name"];

Console.WriteLine(json4_name);
June

3.2.2 Element값 삭제하기

.Remove(key)를 이용해서 삭제가 가능합니다.
json4.Remove("name");

Console.WriteLine(json4.ToString());
{
  "id": "J01",
  "age": 23
}
.RemoveAll()로 모든 Element를 다 삭제 할 수도 있습니다.
json5.RemoveAll();

Console.WriteLine(json5.ToString());
{}

4. JArray 사용법

Element 입력시 key를 가지지 않는 다는 것을 빼고는 JObject와 거의 같습니다.

4.1 Element 추가하기

4.1.1 기본적인 사용법

var jarray = new JArray();
jarray.Add(1);
jarray.Add("Luna");
jarray.Add(DateTime.Now);

Console.WriteLine(jarray.ToString());
[
  1,
  "Luna",
  "2016-05-21T09:45:27.1049839+09:00"
]

!#4.1.2 JObject를 Element로 추가

var jFriends = new JArray();
jFriends.Add(json);
jFriends.Add(json2);
jFriends.Add(json3);
jFriends.Add(json4);

Console.WriteLine(jFriends.ToString());
[
  {
    "id": "Luna",
    "name": "Silver",
    "age": 19
  },
  {
    "id": "Luna",
    "name": "Silver",
    "age": 19,
    "blog": "devluna.blogspot.kr"
  },
  {
    "id": "SJ",
    "name": "Philip",
    "age": 25
  },
  {
    "id": "J01",
    "age": 23
  }
]

4.1.3 JArray를 Element로 추가

var jarray2 = new JArray();
jarray2.Add(jarray);
jarray2.Add(jFriends);

Console.WriteLine(jarray2.ToString());
[
  [
    1,
    "Luna",
    "2016-05-21T09:51:03.2882071+09:00"
  ],
  [
    {
      "id": "Luna",
      "name": "Silver",
      "age": 19
    },
    {
      "id": "Luna",
      "name": "Silver",
      "age": 19,
      "blog": "devluna.blogspot.kr"
    },
    {
      "id": "SJ",
      "name": "Philip",
      "age": 25
    },
    {
      "id": "J01",
      "age": 23
    }
  ]
]

4.2 Element값 사용하기

4.2.1 Element값 읽기

[ ] 연산자로 읽을 수 있습니다.
var jf0 = jFriends[0];

Console.WriteLine(jf0.ToString());
{
  "id": "Luna",
  "name": "Silver",
  "age": 19
}
for , foreach로 iteration이 가능합니다.
foreach(JObject fElement in jFriends)
{
    var fName = fElement["name"] ?? "<NULL>";
    Console.WriteLine(fName);
}
Silver
Silver
Philip
<NULL>

4.2.2 Element값 삭제하기

jFriends.Remove(jFriends[1]);
jFriends.Remove(jFriends[2]);

Console.WriteLine(jFriends.ToString());
[
  {
    "id": "Luna",
    "name": "Silver",
    "age": 19
  },
  {
    "id": "SJ",
    "name": "Philip",
    "age": 25
  }
]

5. JObject에 JArray 추가하기

json2.Add("Friends", jFriends);

Console.WriteLine(json2.ToString());
{
  "id": "Luna",
  "name": "Silver",
  "age": 19,
  "blog": "devluna.blogspot.kr",
  "Friends": [
    {
      "id": "Luna",
      "name": "Silver",
      "age": 19
    },
    {
      "id": "SJ",
      "name": "Philip",
      "age": 25
    }
  ]
}

2015년 9월 16일 수요일

jsoncpp 를 이용하여 C++에서 JSON 생성 및 Parsing 하기

* 왜 jsoncpp를 선택했을까 ?

앞서 C++ Rest SDK (code명 Casablanca)의 web::json::value를 사용하여 JSON을 활용하는 방법을 설명한 적이 있습니다.

http://devluna.blogspot.kr/2015/05/webjsonvalue-c-rest-sdk.html

cpprestsdk의 경우 Github에서 full source 를 받을 수 있습니다.

https://github.com/Microsoft/cpprestsdk

build 하기 위해서는 openSSL, boost 를 받아야 합니다.
openSSL, boost를 바뀌는 개발툴에 따라 빌드하는 일이 쉽지는 않습니다.
Visual Studio에서는 nuget pacakge를 이용하여 쉽게 설치가 가능하지만,
그 역시도 개발Tool이 바뀔때마다 해야할 작업이 많습니다.

그래서 괜찮은 JSON Parser가 없나 찾아보다가 jsoncpp 를 발견하였습니다.

jsoncpp 는 .cpp 파일 1개와 .h 파일 2개 총 3개의 file을 project에 추가하면 되므로 별도의 .lib 생성 작업을 할 필요가 없습니다.

* jsoncpp 설치

먼저 jsoncpp의 최신버전을 다운 받습니다.

https://github.com/open-source-parsers/jsoncpp


저는 .zip 파일로 다운을 받아서 압축을 풀었습니다.
압축을 푼 폴더의 readme.md 파일을 읽어보면 amalgamate.py 파일을 이용하여 file 생성하는 방법이 설명되어 있습니다.

python amalgamate.py


Python이 설치되지 않았다면 Python 2.6 이상 버전을 다운받아서 설치하면 됩니다.
아래 Link에 설치방법이 설명되어 있습니다.

http://devluna.blogspot.kr/2015/07/python-00.html

dist 폴더 아래에 3개의 파일이 생성되었다는 메세지가 출력되었습니다.
해당 파일들을 복사해서 작업중인 폴더에 복사하시면 됩니다.

* JSON 생성

Json::Value 타입이 JSON document가 됩니다.
값을 입력하는 방법은 인덱스 연산자 [ ] 안에 key를 입력하고 value를 대입하면 됩니다.
배열 형태의 값은 .append() 라는 메서드를 이용합니다.
내부에 다른 JSON document를 넣을 경우에는 연산자 [ ] 안에 key를 입력하고 Json::Value를 대입하면 됩니다.

Json::Value의 값을 출력하고자 할때는 Json::StyledWriter를 이용하면 됩니다.

예제를 보시면 쉽게 이해가 될 것입니다.

그 결과 생성된 JSON 은 다음과 같습니다.

* JSON Parsing

jsoncpp는 cpprestsdk에 비해서 훨씬 더 강력하고 편리한 기능들을 제공해줍니다.

Json::Reader 를 이용하여 string 으로 된 JSON 을 parsing 하여 Json:;Value 객체 생성이 가능합니다.

.getMemberNames() 메서드를 이용하여 document 내의 key들을 vector<std::string> 로 return이 가능합니다. (cpprestsdk에는 없는 기능이었습니다)

나머지는 cpprestsdk 와 비슷합니다.
.is타입명() 메서드로 타입 확인이 가능하며 .as타입명() 으로 value 값을 받을 수 있습니다.
아래 예제에는 설명이 없지만,  .type() 함수를 이용해서 타입을 return 받을 수도 있습니다.
(타입은 enum 형식으로 정의되어 있습니다.)

예제를 살펴보겠습니다.
예제에서의 str은 위에서 생성한 string을 그대로 이용했습니다.