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

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


你可能感兴趣的:(C++,json)