Reader类:负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。
Writer类:负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。
Value类:其对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,Value是递归的。解析一个JSON文档的大致过程如下:
//生命顶级Value对象Json:: 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 ) { switch ( value.type() ) { case Json::nullValue: out.outvalue("null"); break; case Json::intValue: out.outvalue(value.asInt()); break; case Json::uintValue: out.outvalue(value.asUInt()); break; case Json::realValue: out.outvalue(value.asDouble()); break; case Json::stringValue: out.outvalue(value.asString().c_str()); break; case Json::booleanValue: break; out.outvalue(value.asBool()); break; case Json::arrayValue: { int size = value.size(); //数组类型,使用数字下标作为索引遍历所有元素 for ( int index =0; index < size; ++index ) { printValueTree( out, value[index] ); } } break; case Json::objectValue: { //对象类型,其成员被保存在一个map里面,使用name作为索引进行查找 Json::Value::Members members( value.getMemberNames() ); //遍历所有的name,查找值 for ( Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it ) { const std::string &name = *it; printValueTree( out, value[index] ); } } break; default: } }
Struct user { Int id; String name; Struct { Int homeserver; Int vistserver; }serverinfo; Int skillids[3]; };可使用如下定义的JSON文档表示:
{ "Type":"USER_INFO", "Data": { "id":1, "name":"spring", "server": { "homeserver":1001, "vistserver":1003 }, "skillids": [ 1,3,5 ] } }二、从内存中创建Value对象
在需要将内存数据转换为JSON时,就需要从内存中创建一个Value对象,然后再转化为文本进行输出。从内存中创建Value对象也是常用的操作,对于需要转化为JSON文档表示的数据结构,都需要定义一个toJson成员函数:
Bool toJson(Json::Value& value);
其内部实现模式为:
(1)如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。如:Value(datatype);
(2)如果要创建一个对象类型的Value,首先使用Value root(ValueType type = objectValue)声明一个空的、类型为对象的Value对象。然后使用类似于root[“type”] = “USER_INFO”的表达式,往root中添加属性(key/value对)。
(3)如果要创建一个数组类型的Value,首先使用Value root(ValueType type = arrayValue)声明一个空的、类型为数组的Value对象。然后使用root.append(Value&),在数组的末尾追加一个值,或者使用root[index]来添加数组的元素。如果index值超出了当前数组的长度,那么将会在数组末尾追加一个元素,并返回这个元素的引用。要创建代表如下JSON文档的Value对象:{ "Type":"USER_INFO", "Data": { "id":1, "name":"spring", "server": { "homeserver":1001, "vistserver":1003 }, "skillids": [ 1,3,5 ] } }
需要如下代码:
//声明object类型的对象,根对象
Value root(objectValue);
//添加Type属性,这里隐含自动类型转换,将string转化为Value
Root[“Type”] = “USER_INFO”;
//下面创建Data子对象
Value Data(objectValue);
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;
至此, root对象构建完毕。Json:: FastWriter writer;
String _jsondoc = writer.write( root );
_jsondoc中即包含了输出的JSON格式的文档。