前言
c++中解析json大多数都用jsoncpp这个库,但jsoncpp下载下来的一堆文件看不懂,实际上在项目中使用的话需要二次编译。我希望编译出来的文件能简单且在windows和linux上同时使用,但网上并没有对此作出详细介绍,自己总结了一下,并简单封装了json解析
使用json有两种方法,一种是直接使用json的.cpp和.h文件,另一种是编译出静态链接库,在项目中使用静态库
注意:github上的源码好像无法用vs编译出静态库的
一、生成.cpp和.h文件
- 下载github上jsoncpp的源码
- 下载完成后解压,进入目录,通过python命令构建头文件和源文件(貌似这个方法比较简单)
打开cmd,进入文件目录
在通过python命令构建头文件和源文件之前需要安装python
构建
python amalgamate.py
会在当前文件夹下生成dist目录
将dist中的文件拷到自己的项目中,并添加到项目,尽量不要更改.cpp和.h文件的目录结构
使用时记得包含头文件
#include "json/json.h"
#include "json/json-forwards.h"
这种方法思路简单,windows和linux应该都可以用
二、编译静态链接库
这种方法windows和linux需要编译出不同的库,且不同编译器导入库的方法也不同
该种方式需要使用官网中的jsoncpp
链接:jsoncpp官网
鉴于这种方法较为复杂,就不详细介绍了,下面这篇博客介绍了viusal studio中使用静态链接库(viusal studio生成的静态库qt也可以使用,但不清楚如何生成linux中的静态库)
链接:JsonCpp的基本用法
json案例:
{
"StatusCode": 200,
"ErrCode": 0,
"Msg": "success",
"Data": [
{
"SchoolID": "S-05061410",
"schoolName": "北京大学",
"SchoolType": 1
},
{
"SchoolID": "S-05061411",
"schoolName": "东南大学",
"SchoolType": 5
}
]
}
字符串转为json及json解析
std::string str = "{\"StatusCode\": 200,\"ErrCode\" : 0,\"Msg\" : \"success\",\"Data\" : [{\"SchoolID\": \"S-05061410\",\"schoolName\" : \"北京大学\",\"SchoolType\" : 1},{\"SchoolID\": \"S-05061411\",\"schoolName\" : \"东南大学\",\"SchoolType\" : 5}]}";
std::string str1=string_To_UTF8(str);
Json::Reader reader;
Json::Value value1;
// reader将Json字符串str解析到value
if (reader.parse(str1, value1))
{
//json转int
int StatusCode = value1["StatusCode"].asInt();
int ErrCode = value1["ErrCode"].asInt();
//json转string
std::string Msg = value1["Msg"].asString();
//json数组转json
Json::Value Data = value1["Data"];
//遍历数组
for (int i = 0; i < Data.size(); i++)
{
std::string SchoolID = Data[i]["SchoolID"].asString();
std::string schoolName = Data[i]["schoolName"].asString();
int SchoolType = Data[i]["SchoolType"].asInt();
}
}
json转字符串
//json转字符串
Json::FastWriter fast_writer;
auto str2 = fast_writer.write(value1); //value1转为str2
注意:json默认是要utf-8编码的,正常编译器都是unicode编码,所以json在使用过程中大概率会出现乱码问题,需要看情况进行正确的转码
码字不易,如果这篇博客对你有帮助,麻烦点赞收藏,非常感谢!有不对的地方