vs2017编译使用jsoncpp
C++ 解析json的方式有很多,libjson, jsoncpp, boost等,我的另一篇博客有boost解析json的用法,有兴趣的可以看看,本篇介绍jsoncpp的使用。
一 、cmkae vs2017编译jsoncpp
下载jsoncpp源码:https://github.com/open-source-parsers/jsoncpp
在源码目录建立build_vs2017目录,如下图配置。第一次点击Configure,需要配置编译选项,我选的编译选项是vs2017 x64. 编译完成后会出现如下红色界面,勾选BUILD_SHARED_LIBS: 生成dll, 其它的test和example可以不用勾选。再次点击Configure完成后就不会有红色了,点击Generate生成项目。
用vs2017打开项目
为了debug和release有区别,我把debug版dll加了_d, 如下图:
dll
lib
右键jsoncpp_lib --->[仅用于项目]---->仅生成
Debug和Release版都以编译一遍。
dll生成的路径 jsoncpp\build_vs2017\src\lib_json\Debug
也可以直接下载我编译好的dll, 点击 jsoncpp_sdk_x64 即可下载。
二、vs2017使用jsoncpp
可以直接解析json字符串,也可以解析文本,data.json文件如下:
{
"status" : 0 ,
"msg" : "MSG_GETCODE",
"resultItem" :{
"ok":"成功",
"No":"失败"
},
"lesson": [
"Math",
"English"
]
}
写代码前,需要配置jsoncpp,如果想用新式jsoncpp API, 就不需要禁用4996警告,另外debug和release要分开配置。示例代码如下:
#include <iostream>
#include <string>
#include "json.h"
#include <fstream>
#include <cassert>
using namespace std;
#pragma warning(disable : 4996) //禁用新式jsoncpp API
#ifdef _DEBUG
#pragma comment(lib, "jsoncpp_d.lib")
#endif
//从文件解析json
int fileRead()
{
ifstream ifs;
ifs.open("data.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
return -1;
}
std::string msq = root["msg"].asString();
int status = root["status"].asInt();
std::cout << msq << std::endl;
std::cout << status << std::endl;
//判断key是否存在,不存在则key对应的值为空
if (root.isMember("qwert"))
{
cout << "存在key: qwert" << endl;
}
else
{
cout << "不存在key: qwert" << endl;
}
//判断值是否为空
if (root["msg"].isNull())
{
cout << "msg对应的值为空" << endl;
}
else
{
cout << "msg对应的值不为空" << endl;
}
//如果没有这个key,那么值也是空
if (root["msg11"].isNull())
{
cout << "msg11对应的值为空" << endl;
}
else
{
cout << "msg11对应的值不为空" << endl;
}
ifs.close();
return 0;
}
/*
{
id:1,
Name:mike,
Age:15,
Address:[
{
City:Beijing,
Code:1111
},
{
City:Shanghai,
Code:2222
}
],
Email:aaa@qq.com
}
*/
int stringRead()
{
string strValue = "{\"id\" :1, \"Name\" : \"mike\" , \"Age\" :15,"
"\"Address\" :[{ \"City\" : \"Beijing\" , \"Code\" : \"1111\" }, { \"City\" : \"Shanghai\" , \"Code\" : \"2222\" }], \"Email\" : \"aaa@qq.com\"}";
Json::Reader read;
Json::Value jsonObj;
if (read.parse(strValue, jsonObj))
{
string name = jsonObj["Name"].asCString();
cout << name << endl;
}
return 0;
}
int main()
{
fileRead();
return 0;
}
运行结果:
上一篇: 用命令行将远程服务器的 MySQL 表数据导出到本地
下一篇: 树状数组求逆序数 POJ 2299