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

原创 2015年07月10日 16:27:30
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格式的文档。


一个项目调用另一个项目接口,传递json参数

项目需求是在一个项目中,从mysql获取数据,转换成json串,用HttpClient调用另一个项目的接口,并传递json数据;另一个项目接收json​数据,解析后再写入到oracle中...
  • qq346859029
  • qq346859029
  • 2016年09月09日 11:24
  • 1589

Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据

实现效果 实现原因 目前主流的CS结构,数据都是通过RESTful风格接口形式呈现,不管是桌面级应用程序还是手机端,接口是我们获取数据的大多数选择,主流数据接口呈现形式主要...
  • qq_35192741
  • qq_35192741
  • 2017年07月26日 10:27
  • 875

Jsoncpp 使用方法大全

JsoncppJson(JavaScript Object Notation )是一种轻量级的数据交换格式。简而言之,Json组织形式就和python中的字典, C/C++中的map一样,是通过ke...
  • yc461515457
  • yc461515457
  • 2016年10月07日 15:04
  • 8076

JsonCpp使用方法详解

JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp是c++解析JSON串常用的解析库之一。 jsoncpp中主要的类:...
  • u012372584
  • u012372584
  • 2017年12月26日 12:58
  • 232

VS下 jsoncpp的编译使用教程

1.点击源代码下的jsoncpp-src-0.5.0\makefiles\vs71  选则jsoncpp.sln 2.打开vs2013 点击项目json_lib  右键-属性-C、C++/-代码生成 ...
  • dong_18383219470
  • dong_18383219470
  • 2016年09月15日 10:34
  • 429

jsoncpp使用方法

使用 C++ 处理 JSON 数据交换格式   一、摘要     JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的...
  • wangchangshuai0010
  • wangchangshuai0010
  • 2014年01月12日 11:10
  • 18652

Json概念及jsoncpp编程接口说明

  • 2013年10月29日 09:49
  • 92KB
  • 下载

C++处理JSON数据和在face++ 调用中的使用

使用C++处理JSON数据交换格式 一、摘要     JSON的全称为:JavaScript Object Notation,顾名思义,JSON是用于标记Javascript对象的,JSON官方的解释...
  • u014114990
  • u014114990
  • 2016年03月28日 17:29
  • 2354

Jsoncpp使用详解以及链接问题解决

Jsoncpp使用详解以及链接问题解决
  • chenqiai0
  • chenqiai0
  • 2015年08月01日 16:18
  • 4880

C++解析JSON进行网络传输--jsoncpp的学习分析

1、jsoncpp的功能: jsoncpp是一个使用C++解析json的开源库。 2、使用方法: 见http://blog.csdn.net/lizuqingblog/article/detail...
  • liwuji930726
  • liwuji930726
  • 2014年02月25日 14:18
  • 1524
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Jsoncpp编程接口及使用方法简介
举报原因:
原因补充:

(最多只允许输入30个字)