Build
- SourceForge 에서 0.6.0RC 다운로드
- wget http://sourceforge.net/projects/jsoncpp/files/jsoncpp/0.6.0-rc2/jsoncpp-src-0.6.0-rc2.tar.gz/download
- 압축 해제 및 폴더 이동
- tar zxvf jsoncpp-src-0.6.0-rc2.tar.gz
- cd jsoncpp-src-0.6.0-rc2
- scons 라는 python 으로 된 build 툴을 설치해야 한다.
- yum install scons -y
platform 에 맞는 build 환경 구성 & compile
scons platform=PLTFRM [TARGET]
PLTFRM 은 환경에 맞게 기술하면 되고 다음과 같은 값이 설정 가능 (README.txt 참고)
suncc Sun C++ (Solaris)
vacpp Visual Age C++ (AIX)
mingw
msvc6 Microsoft Visual Studio 6 service pack 5-6
msvc70 Microsoft Visual Studio 2002
msvc71 Microsoft Visual Studio 2003
msvc80 Microsoft Visual Studio 2005
msvc90 Microsoft Visual Studio 2008
linux-gcc Gnu C++ (linux, also reported to work for Mac OS X)
사용하는 환경이 RHEL/CentOS 이므로 platform 에 linux-gcc 입력
- scons platform=linux-gcc
- test (check target 을 실행하면 됨)
- scons platform=linux-gcc check
Amalgamation
jsoncpp 를 library 로 만들지 않고 단일 source와 header 로 만들어서 프로젝트에 포함시킬수 있다.
위 명령어를 실행하면 dist/ 폴더밑에 다음과 같은 세 개의 파일이 생성되며 이 파일을 프로젝트 빌드시 같이 빌드하면 된다.
다음과 같은 에러가 발생할 경우 파일 경로가 / 가 아니라 \ 로 되어서 발생한 문제이다. amalgamate.py 를 열어서 add_file에 \ 로 된 파일을 찾아서 / 로 바꾸면 된다.
Traceback (most recent call last):
File "amalgamate.py", line 147, in <module>
main()
File "amalgamate.py", line 139, in main
header_include_path=options.header_include_path )
File "amalgamate.py", line 111, in amalgamate_source
source.add_file( 'src/lib_json\json_tool.h' )
File "amalgamate.py", line 30, in add_file
f = open( os.path.join( self.top_dir, relative_input_path ), 'rt' )
IOError: [Errno 2] No such file or directory: '/home/lesstif/work/jsoncpp-src-0.6.0-rc2/src/lib_json\\json_tool.h'
사용
http://garajeando.blogspot.kr/2011/06/we-are-using-json-javascript-object.html 에서 발췌한 예제
다음 소스를 test_json.cpp 로 저장
#include <cstdio>
#include <cstring>
// This is the JSON header
#include "json/json.h"
using namespace std;
int main(int argc, char **argv)
{
string json_example = "{\"array\": \
[\"item1\", \
\"item2\"], \
\"not an array\": \
\"asdf\" \
}";
// Let's parse it
Json::Value root;
Json::Reader reader;
bool parsedSuccess = reader.parse(json_example, root, false);
if(not parsedSuccess)
{
// Report failures and their locations in the document.
cout<<"Failed to parse JSON"<<endl
<<reader.getFormatedErrorMessages()
<<endl;
return 1;
}
// Let's extract the array contained in the root object
const Json::Value array = root["array"];
// Iterate over sequence elements and print its values
for(unsigned int index=0; index<array.size(); ++index)
{
cout<<"Element " <<index
<<" in array: "
<<array[index].asString()
<<endl;
}
// Lets extract the not array element contained in the root object and print its value
const Json::Value notAnArray = root["not an array"];
if(not notAnArray.isNull())
{
cout<<"Not an array: "
<<notAnArray.asString()
<<endl;
}
// If we want to print JSON is as easy as doing:
cout<<"Json Example pretty print: "
<<endl<<root.toStyledString()
<<endl;
return 0;
}
- Amalgamation 된 세 개의 파일을 위 파일 경로에 복사( header 는 json/ 폴더 밑에 위치)
- compile
- g++ -o test_json test_json.cpp jsoncpp.cpp -I. -DJSON_IS_AMALGAMATION
- 실행
./test_json
Element 0 in array: item1
Element 1 in array: item2
Not an array: asdf
Json Example pretty print:
{
"array" : [ "item1", "item2" ],
"not an array" : "asdf"
}
JsonCpp 사이트 예제
example.json
// Configuration options
{
// Default encoding for text
"encoding" : "UTF-8",
// Plug-ins loaded at start-up
"plug-ins" : [
"python",
"c++",
"ruby"
],
// Tab indent size
"indent" : { "length" : 3, "use_space": true }
}
example.cpp
#include <stdlib.h>
#include <fstream>
// This is the JSON header
#include "json/json.h"
using namespace std;
int main(int argc, char **argv)
{
ifstream ifs("example.json");
Json::Value root; // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse(ifs, root );
if ( !parsingSuccessful )
{
// report to the user the failure and their locations in the document.
std::cout << "Failed to parse configuration\n"
<< reader.getFormattedErrorMessages();
return 0;
}
// Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
// such member.
std::string encoding = root.get("encoding", "UTF-8" ).asString();
// Get the value of the member of root named 'encoding', return a 'null' value if
// there is no such member.
const Json::Value plugins = root["plug-ins"];
cout << "plug-ins : ";
for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
cout << plugins[index].asString() << ",";
cout << endl;
//setIndentLength( root["indent"].get("length", 3).asInt() );
//setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
// ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = "UTF-16";
root["indent"]["length"] = 5;
root["indent"]["use_space"] = 0;
Json::StyledWriter writer;
// Make a new JSON document for the configuration. Preserve original comments.
std::string outputConfig = writer.write( root );
// You can also use streams. This will put the contents of any JSON
// stream at a particular sub-value, if you'd like.
std::cin >> root["subtree"];
// And you can write to a stream, using the StyledWriter automatically.
std::cout << root;
return 0;
}
- compile
- g++ -o example example.cpp jsoncpp.cpp -I. -DJSON_IS_AMALGAMATION
- 실행
- ./example
jsonCPP 는 std::cin stream 에서 json 데이타를 입력받을수 있고 위 예제는 subtree 라는 value 를 요구하므로 아래와 같은 json data 를 입력하고 Ctrl-D 를 누르면 된다.
./example
plug-ins : python,c++,ruby,
{ "name": "value",
"arrary": {
"age": 99,
"ar": [
1,
2,
3,
4
]
}
}
결과
{// Default encoding for text
"encoding" : "UTF-16",// Tab indent size
"indent" :
{
"length" : 5,
"use_space" : 0
},// Plug-ins loaded at start-up
"plug-ins" : [ "python", "c++", "ruby" ],
"subtree" :
{
"arrary" :
{
"age" : 99,
"ar" : [ 1, 2, 3, 4 ]
},
"name" : "value"
}
}