jsoncpp的简单使用

OS:ubuntu 12.04

JSONCPP : 0.5.0

关于JSONCPP

JSONCPP是一个比较流行的C/C++用来解析json的库,最新的版本是0.5.0,源代码下载地址点击 这里

JSONCPP的编译需要使用scons(ubuntu的用户直接apt-get install scons即可),编译成功后会在jsoncpp-src-0.5.0/libs/linux-gcc-4.7/ 下生成一个libjson_linux-gcc-4.7_libmt.so,开发头文件在include文件夹下。在编译自己的项目时需要加入-ljson_linux-gcc-4.7_libmt编译参数。

JSON结构

Value

alt none

String

alt none

Number

alt none

Object

json中的object是“名称/值”对的无序集合,类似于STL中的map。一个object以左大括号’{‘开始,右大括号结束’}’,名称和值之间使用冒号’:’分割,“名称/值”对与“名称/值”对之间使用逗号’,’分割。object可以被嵌套,可以作为其他类型的子元素。 一些例子:

alt none

Array

json中的数组,以左方括号’[‘开始,右方括号’]’结束,元素跟元素之间以逗号’,’分割。 一个例子:

alt none

使用JSONCPP解析json文件

文件test.json内容:

{
    "id":7,
    "type":"pic",
    "deps":[
     {"order":1,"path":"/home/11.bmp"},
     {"order":1,"path":"/home/22.bmp"},
     {"order":1,"path":"/home/44.bmp"},
     {"order":2,"path":"/home/44.bmp"}
]
}
bool parseFile2(std::string path) {

	std::ifstream in;
	in.open(path.c_str(), std::ifstream::in);
	assert(in.is_open());

	Json::Reader reader;
	Json::Value value;

	if (!reader.parse(in, value, false)) {
		std::cerr  << "paser json file error!" << std::endl;
		return false;
	}

	std::cout << "id : "  << value["id"].asInt() << std::endl;
	std::cout << "type : " << value["type"].asString() << std::endl;
        
        Json::Value array;
        array = value["deps"];

	for(unsigned int i = 0; i < array.size(); i++) {
            std::cout << "order : " << array[i]["order"].asInt() << std::endl;
            std::cout << "path : " << array[i]["path"].asString() << std::endl;
        }	

	return true;
}

如果不是从文件读入, JSONCPP也可以直接处理json字符串:

bool parseString(std::string str) {

	Json::Reader reader;
	Json::Value value;

	if (!reader.parse(str, value)) {
		std::cerr << "paser json string error!" << std::endl;
		return false;
	}

        ...  ...

	return true;
}