Jsoncpp编程接口及使用方法简介

来源:互联网 发布:为什么windows无法启动 编辑:程序博客网 时间:2024/05/16 04:59
Jsoncpp编程接口简介

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


0 0