Jsoncpp编程接口

前端之家收集整理的这篇文章主要介绍了Jsoncpp编程接口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Jsoncpp编程接口

@H_301_3@
Jsoncpp是一个使用C++语言实现的面向对象的json库,以静态库的形式提供,使用非常简单。
@H_301_3@Jsoncpp提供的接口中有3个核心类:Reader、Writer、Value。
@H_301_3@Reader类负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。
@H_301_3@Writer类负责将内存中的Value对象转换成JSON文档,输出文件或者是字符串中。
@H_301_3@Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,@H_301_3@Value是递归的。


解析JSON文档
@H_301_3@解析一个JSON文档的大致过程如下:
//生命顶级Value对象
Json::@H_301_3@ 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 )
{
@H_301_3@switch ( value.type() )
@H_301_3@{
@H_301_3@case Json::nullValue:
@H_301_3@out.outvalue("null");
@H_301_3@break;
@H_301_3@case Json::intValue:
@H_301_3@out.outvalue(value.asInt());
@H_301_3@break;
@H_301_3@case Json::uintValue:
@H_301_3@out.outvalue(value.asUInt());
@H_301_3@break;
@H_301_3@case Json::realValue:
@H_301_3@out.outvalue(value.asDouble());
@H_301_3@break;
@H_301_3@case Json::stringValue:
@H_301_3@out.outvalue(value.asString().c_str());
@H_301_3@break;
@H_301_3@case Json::booleanValue:
@H_301_3@break;
@H_301_3@out.outvalue(value.asBool());
@H_301_3@break;
@H_301_3@case Json::arrayValue:
@H_301_3@{
@H_301_3@int size = value.size(); //数组类型,使用数字下标作为索引遍历所有元素
@H_301_3@for ( int index =0; index < size; ++index )
@H_301_3@{
@H_301_3@printValueTree( out,value[index] );
@H_301_3@}
@H_301_3@}
@H_301_3@break;
@H_301_3@case Json::objectValue:
@H_301_3@{ //对象类型,其成员被保存在一个map里面,使用name作为索引进行查找
@H_301_3@Json::Value::Members members( value.getMemberNames() );
@H_301_3@//遍历所有的name,查找值
@H_301_3@for ( Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it )
@H_301_3@{
@H_301_3@const std::string &name = *it;
@H_301_3@printValueTree( out,value[index] );
@H_301_3@}
@H_301_3@}
@H_301_3@break;
@H_301_3@default:
@H_301_3@}
}

不同定义的JSON文档,保存不同的数据,解析之后的数据也需要使用不同的数据结构来存储。比如如下结构体:
Struct user
{
@H_301_3@Int id;
@H_301_3@String name;
@H_301_3@Struct
@H_301_3@{
@H_301_3@Int homeserver;
@H_301_3@Int vistserver;
@H_301_3@}serverinfo;
@H_301_3@Int skillids[3];
};


可使用如下定义的JSON文档表示:
{
@H_301_3@“Type”:“USER_INFO”,
@H_301_3@“Data”:
@H_301_3@{
@H_301_3@“id”:1,
@H_301_3@“name”:“spring”,
@H_301_3@“server”:
@H_301_3@{
@H_301_3@“homeserver”:1001,
@H_301_3@“vistserver”:1003
@H_301_3@},
@H_301_3@“skillids”:
@H_301_3@[
@H_301_3@1,2,3
@H_301_3@]
@H_301_3@}
}


从内存中创建Value对象
@H_301_3@在需要将内存数据转换为JSON时,就需要从内存中创建一个Value对象,然后再转化为文本进行输出。所以从内存中创建Value对象也是常用的操作,所有需要转化为JSON文档表示的数据结构都需要定义一个toJson成员函数:@H_301_3@Bool toJson(@H_301_3@ Json::Value& value@H_301_3@);
@H_301_3@内部实现模式如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。如: Value( datatype );


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


@H_301_3@如果要创建一个数组类型的Value,首先使用@H_301_3@Value root(ValueType type = arrayValue)声明一个空的类型为数组的Value对象。然后使用root.append(Value&)成员,在数组的末尾追加一个值,或者使用root[index]来访问数组的元素。如果index值超出了当前数组的长度,那么将会在数组末尾追加一个元素,并返回这个元素的引用。


要创建代表如下JSON文档的Value对象:
{
@H_301_3@“Type”:“USER_INFO”,

@H_301_3@“Data”:

@H_301_3@{

@H_301_3@“id”:1,

@H_301_3@“name”:“spring”,
@H_301_3@“server”:

@H_301_3@ {

@H_301_3@“homeserver”:1001,

@H_301_3@“vistserver”:1003

@H_301_3@},

@H_301_3@“skillids”:

@H_301_3@@H_301_3@[

@H_301_3@1,3,5

@H_301_3@@H_301_3@]
@H_301_3@}

}

需要如下代码

//声明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;

至此@H_301_3@ root@H_301_3@对象构建完毕。


Value转换为JSON文档
@H_301_3@Jsoncpp
@H_301_3@提供了几个类可以完成这个任务,虽然稍有不同,但基本一样,尽在排版风格上稍有差异。
@H_301_3@以简单的FastWriter为例:

@H_301_3@Json:: FastWriter writer;

String _jsondoc = writer.write( root );

_jsondoc中即包含了输出的JSON格式的文档。

猜你在找的Json相关文章