《VC++实战》之开源库json-cpp的使用

1 json概述

(摘自百度百科)JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2 通讯编程中使用json的重要性

json似乎成了个代名词,CS架构中,只要涉及通讯,好多朋友首先便想到了json。原因无疑是因为采用json不管是在通讯命令的封包、拆包、解析,还是在日志调试、维护过程,都非常方便,可读性非常高。当然也有好多采用xml,或者是自定义命令字符串,在编程效率、运行效率、可扩展性、可维护性等方面进行斟酌无可厚非,仁者见仁智者见智。现在的好多企业在前期通讯协议设计时皆采用json格式,使得对接方必然也得采用json。在通讯编程中,json的重要性由此可见是及其重要。

3 开源库json-cpp的使用

在Windows VC++开发中,Windows没有集成自己的json库,选用开源库cJSON和json-cpp的比较多,本节主要介绍json-cpp在VC++中的使用。

3.1 下载json-cpp库

https://sourceforge.net/projects/jsoncpp/下载最新版json-cpp库。解压后得到如下目录

《VC++实战》之开源库json-cpp的使用

3.2 json-cpp使用

json-cpp使用方式有两种,一种是包含头文件调用lib库间接使用,另一种方式是将json-cpp源码加入到工程直接使用。

3.2.1 调用lib库方式

用Visual Studio打开jsoncpp-src-0.5.0\makefiles\vs71下的jsoncpp.sln工程,选择Release进行编译。之后在jsoncpp-src-0.5.0\build\vs71\release\lib_json下生成json_vc71_libmt.lib。

《VC++实战》之开源库json-cpp的使用

将json_vc71_libmt.lib加入到工程,并包含jsoncpp-src-0.5.0\include\json下的所有头文件。

3.2.2 json-cpp源码加入方式

将jsoncpp-src-0.5.0\src\lib_json下的所有源文件和jsoncpp-src-0.5.0\include\json下的所有头文件添加到工程。将json_reader.cpp、json_value.cpp和json_writer.cpp属性->C/C++->Precompiled Header配置为Not Using Precompiled Headers。

3.2.3 json-cpp解析json字符串

有如下json格式字符串:

"\"code\":100,\"error\":\"no error\",\"value\":{\"networkId\":\"88345\",\"date\":\"2019.02.22\",\num\":45}"

解析示例:

void JsonAnalyze(const char* str)
{
	Json::Reader reader;  
	Json::Value root; 

	if (reader.parse(str, root))
	{  
		int code = root["code"].asInt();
		string error = root["error"].asString();

		Json::Value jValue = root["value"];
		string networkId = jValue["networkId"].asString();
		string date = jValue["date"].asString();
		string num = jValue["num"].asInt();
	}
}

3.2.4 json-cpp打包json字符串

string PackJson()
{
	Json::Value root;

	root["code"] = 100;
	root["error"] = "no error";
	
	Json::Value jValue;
	jValue["networkId"] = "123456sa";
	jValue["date"] = "2019.03.21";
	jValue["num"] = 32;
	
	root["value"] = jValue;

	return root.toStyledString();
}

得到如下字符串:

"\"code\":100,\"error\":\"no error\",\"value\":{\"networkId\":\"123456sa\",\"date\":\"2019.03.21\",\num\":32}"

 

;