Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JSONCPP介绍及使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一、JSON简介

JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。

JSON由两种基本结构构成:

1"名称/对的集合,可以理解为对象。

2值的组合,可以理解为数组。

对象简单示例

示例

{

"header": {

"pid": "10",

"cas": "1"

},

"body": {

"bodyCode": "JSON",

"bodyName":"JavaScriptObject Notation",

"GUId": "1"

}

}

{

"header": {

"pid": "10",

"ack": [{

"ackCode": "JSON",

"ackName":"JavaScript ObjectNotation",

},{

"ackCode": "JSON",

}

"GUId":"1"

}

JSON更详细的介绍请看官网:http://www.json.org

二、JSONCPP

1. JsonCPP简介

jsoncppc++解析串常用的解析库之一。其常用的类有:

a) Json::Value 可以表示里所有的类型,比如int,String,object,array等,其支持的类型可以参Json:ValueType中的值。

b) Json::reader json文件流或字符串解析到Json::Value,主要函数Parse

C) Json::Writer Json::reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriterJson::StyleWriter,分别输出不带格式的和带格式的

d) Json::Value::Members 主要用于以STL风格解析数组。看过源代码的人已知道,@H_691_14@members其实是typedefvector<String>而已。

2. JSONCPP解析示例

a)串格式

{

"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207",

"Send" : {

"ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631",

"Items" : [

{

"Count" : 2,

"Code" : "0101",

"X" : 1,

"Y" : 2

},

{

"Count" : 2,

"Y" : 2

}

]

}

}

b)生成

{

"Ack" : [

{

"ActualCount" : 2,

"Code" : "0101"

},

{

"ActualCount" : 2,

"Code" : "0101"

}

],

"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"

}

C)解析、生成JSON代码

需要引入的.h文件

#pragma once
#pragma comment(lib,"json_vc71_libmtd.lib")
 
#include "json/json.h"

实现

void CJSONTestDlg::OnBnClickedButton1()
{
	CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);
	CString str; 
	pEdit->GetWindowText(str); //str即为a)中定义的JSON串
	pEdit->FmtLines(true);

	Json::reader reader;
	Json::Value root;

	if (reader.parse(WC2UT(str.GetBuffer(0)),root))  // reader将Json字符串解析到root,root将包含Json里所有子元素
	{
		std::string JsonID = root["JsonID"].asString(); 
		Json::Value rtnRoot;
		rtnRoot["JsonID"]=JsonID;

		Json::Value ack;
		Json::Value send = root["Send"];
		if(!send["Items"].isNull()){
			Json::Value Items = send["Items"];
			int sendSize = Items.size();

			for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值
				std::string  Code = Items[i]["Code"].asString();
				int x = Items[i]["X"].asInt();
				int y = Items[i]["Y"].asInt();
				int count = Items[i]["Count"].asInt();
				
				//更具读到的JSON串中的值生成所需内容
				Json::Value newAckItem;
				newAckItem["Code"]=Code;
				newAckItem["ActualCount"]=count;

				ack.append(newAckItem);
			}
		}
		rtnRoot["Ack"]=ack;
		std::string rtnOut = rtnRoot.toStyledString();//生成带格式的JSON串
#ifdef UNICODE
		std::wString stemp = s2ws(rtnOut); 
		LPCWSTR result = stemp.c_str();
#else
		LPCWSTR result = rtnOut.c_str();
#endif
		messageBox(result,_T("根据JSON串,生成的对应JSON串信息"));
		CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);   
		pEdit->SetWindowText(result);  
	}else{
		CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);   
		pRtnEdit->SetWindowText(_T("JSON格式错误"));  
	}
}

将JSONCPP以静态库方式导入,需要注意项目中代码生成中的运行库,和JSONCPP的静态库项目的代码生成运行库要一致,否则将报如下错误

afxver_.h(81): Fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

项目中的Runtime Library需设置的一样

大佬总结

以上是大佬教程为你收集整理的JSONCPP介绍及使用全部内容,希望文章能够帮你解决JSONCPP介绍及使用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。