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格式的文档。 原文链接:https://www.f2er.com/json/289725.html