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库。解压后得到如下目录
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。
将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}"