Post List

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을 그대로 이용했습니다.