@H_301_3@Jsoncpp是一个使用C++语言实现的面向对象的json库,以静态库的形式提供,使用非常简单。
@H_301_3@Jsoncpp提供的接口中有3个核心类:Reader、Writer、Value。
@H_301_3@Reader类负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。
@H_301_3@Writer类负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。
@H_301_3@Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,@H_301_3@Value是递归的。
解析JSON文档
@H_301_3@解析一个JSON文档的大致过程如下:
//生命顶级Value对象
Json::@H_301_3@ Value root;
//读取文档:
std::string strdoc = readFromFile(…);
//声明Reader对象
Json::Reader _reader;
//解析json文档,生成json值
_reader.paser(strdoc,root);
/*从root中提取数据,基本模式如下函数所示,其中
PARAM out只是抽象的占位符,代表用来保存从Value中提取的数据的对象,并不是一个实际实现的类。*/
GetValueFromTree( PARAM out,Json::Value &value )
{
@H_301_3@switch ( value.type() )
@H_301_3@{
@H_301_3@case Json::nullValue:
@H_301_3@out.outvalue("null");
@H_301_3@break;
@H_301_3@case Json::intValue:
@H_301_3@out.outvalue(value.asInt());
@H_301_3@break;
@H_301_3@case Json::uintValue:
@H_301_3@out.outvalue(value.asUInt());
@H_301_3@break;
@H_301_3@case Json::realValue:
@H_301_3@out.outvalue(value.asDouble());
@H_301_3@break;
@H_301_3@case Json::stringValue:
@H_301_3@out.outvalue(value.asString().c_str());
@H_301_3@break;
@H_301_3@case Json::booleanValue:
@H_301_3@break;
@H_301_3@out.outvalue(value.asBool());
@H_301_3@break;
@H_301_3@case Json::arrayValue:
@H_301_3@{
@H_301_3@int size = value.size(); //数组类型,使用数字下标作为索引遍历所有元素
@H_301_3@for ( int index =0; index < size; ++index )
@H_301_3@{
@H_301_3@printValueTree( out,value[index] );
@H_301_3@}
@H_301_3@}
@H_301_3@break;
@H_301_3@case Json::objectValue:
@H_301_3@{ //对象类型,其成员被保存在一个map里面,使用name作为索引进行查找
@H_301_3@Json::Value::Members members( value.getMemberNames() );
@H_301_3@//遍历所有的name,查找值
@H_301_3@for ( Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it )
@H_301_3@{
@H_301_3@const std::string &name = *it;
@H_301_3@printValueTree( out,value[index] );
@H_301_3@}
@H_301_3@}
@H_301_3@break;
@H_301_3@default:
@H_301_3@}
}
不同定义的JSON文档,保存不同的数据,解析之后的数据也需要使用不同的数据结构来存储。比如如下结构体:
Struct user
{
@H_301_3@Int id;
@H_301_3@String name;
@H_301_3@Struct
@H_301_3@{
@H_301_3@Int homeserver;
@H_301_3@Int vistserver;
@H_301_3@}serverinfo;
@H_301_3@Int skillids[3];
};
可使用如下定义的JSON文档表示:
{
@H_301_3@“Type”:“USER_INFO”,
@H_301_3@“Data”:
@H_301_3@{
@H_301_3@“id”:1,
@H_301_3@“name”:“spring”,
@H_301_3@“server”:
@H_301_3@{
@H_301_3@“homeserver”:1001,
@H_301_3@“vistserver”:1003
@H_301_3@},
@H_301_3@“skillids”:
@H_301_3@[
@H_301_3@1,2,3
@H_301_3@]
@H_301_3@}
}
从内存中创建Value对象
@H_301_3@在需要将内存数据转换为JSON时,就需要从内存中创建一个Value对象,然后再转化为文本进行输出。所以从内存中创建Value对象也是常用的操作,所有需要转化为JSON文档表示的数据结构都需要定义一个toJson成员函数:@H_301_3@Bool toJson(@H_301_3@ Json::Value& value@H_301_3@);
@H_301_3@内部实现模式如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。如: Value( datatype );
要创建代表如下JSON文档的Value对象:
{
@H_301_3@“Type”:“USER_INFO”,
@H_301_3@“Data”:
@H_301_3@{
@H_301_3@“id”:1,
@H_301_3@“name”:“spring”,@H_301_3@“server”:
@H_301_3@ {
@H_301_3@“homeserver”:1001,
@H_301_3@“vistserver”:1003
@H_301_3@},
@H_301_3@“skillids”:@H_301_3@1,3,5
@H_301_3@@H_301_3@]@H_301_3@}
}
需要如下代码:
//声明object类型的对象,根对象
Value root(objectValue);
//添加Type属性,这里隐含自动类型转换,将string转化为Value
Root[“Type”] = “USER_INFO”;
Value Data(objectValue);
//下面创建Data子对象
Data[“id”] = 1;
Data[“name”] = “spring”;
Value _server(objectValue);
_server[“homeserver”] = 1001;
_server[“vistserver”] = 1003;
Data[“server”] = _server;
Value _skillids(objectValue);
_skillids.append(1);
_skillids.append(3);
_skillids.append(3);
Data[“skillids”] = _skillids;
Root[“Data”] = Data;
至此@H_301_3@ root@H_301_3@对象构建完毕。Value转换为JSON文档
@H_301_3@Jsoncpp
@H_301_3@提供了几个类可以完成这个任务,虽然稍有不同,但基本一样,尽在排版风格上稍有差异。
@H_301_3@以简单的FastWriter为例:
@H_301_3@Json:: FastWriter writer;
String _jsondoc = writer.write( root );
_jsondoc中即包含了输出的JSON格式的文档。