Jsoncpp编程接口及使用方法简介
来源:互联网 发布:为什么windows无法启动 编辑:程序博客网 时间:2024/05/16 04:59
Jsoncpp是一个使用C++语言实现的、面向对象的json库,以静态库的形式提供,使用非常简单。其提供的接口中有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,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对象构建完毕。三、Value值转换为JSON文档
Jsoncpp提供了几个类可以完成这个任务,虽然稍有不同,但基本一样,尽在排版风格上稍有差异。以简单的FastWriter为例:
Json:: FastWriter writer;
String _jsondoc = writer.write( root );
_jsondoc中即包含了输出的JSON格式的文档。
- Jsoncpp编程接口及使用方法简介
- jsoncpp使用方法
- jsoncpp使用方法
- JsonCpp简介
- Jsoncpp简介
- jsoncpp简介
- Firebug简介及使用方法
- git简介及使用方法
- makeObjectsPerformSelector使用方法及简介
- lombok简介及使用方法
- LESS简介及使用方法
- Nginx简介及使用方法
- lombok简介及使用方法
- Log4j简介及使用方法
- JsonCpp的简单使用方法
- jsoncpp使用方法总结
- JsonCpp的简单使用方法
- jsoncpp 库的使用方法
- PHP - Sessions
- MS SQL Server中的日期格式化大全
- iOS7导航控制器自定义返回按钮
- 求一个unsigned int 数的二进制表示中有多少个1?
- iOS开发-NSString-2
- Jsoncpp编程接口及使用方法简介
- 删除单链表节点O(1)
- 执行计划中常见index访问方式
- 【枚举+小技巧】【TOJ4115】【Find the number】
- px、dp、dip、dpi、sp 等到底有什么联系区别?
- dumpsys命令的用法
- 6.2-5
- strcpy与memcpy以及strncpy
- 使用DATEADD和DATEDIFF来计算SQL Server的DATETIME值