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 );


如果要创建一个对象类型的Value,首先使用Value root(ValueType type = objectValue)声明一个空的类型为对象的Value对象。 然后使用类似于root[“type”] = “USER_INFO”的表达式,往root中添加属性(key/value对)。


如果要创建一个数组类型的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”;


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格式的文档。

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...