Jsoncpp编程接口
Jsoncpp编程接口 Jsoncpp是一个使用C++语言实现的面向对象的json库,以静态库的形式提供,使用非常简单。 Jsoncpp提供的接口中有3个核心类:Reader、Writer、Value。 Reader类负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。 Writer类负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。 Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,Value是递归的。 解析JSON文档 解析一个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: } } 不同定义的JSON文档,保存不同的数据,解析之后的数据也需要使用不同的数据结构来存储。比如如下结构体: 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,2,3 ] } } 从内存中创建Value对象 在需要将内存数据转换为JSON时,就需要从内存中创建一个Value对象,然后再转化为文本进行输出。所以从内存中创建Value对象也是常用的操作,所有需要转化为JSON文档表示的数据结构都需要定义一个toJson成员函数:Bool toJson( Json::Value& value); 内部实现模式如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。如: Value( datatype );
要创建代表如下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”;
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; 至此 root对象构建完毕。Value转换为JSON文档 Jsoncpp 提供了几个类可以完成这个任务,虽然稍有不同,但基本一样,尽在排版风格上稍有差异。 以简单的FastWriter为例: Json:: FastWriter writer; String _jsondoc = writer.write( root ); _jsondoc中即包含了输出的JSON格式的文档。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |