欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vs2017编译使用jsoncpp

程序员文章站 2022-07-13 21:23:28
...

       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编译使用jsoncpp

          用vs2017打开项目

vs2017编译使用jsoncpp

       为了debug和release有区别,我把debug版dll加了_d, 如下图:

       dll

vs2017编译使用jsoncpp

       lib

vs2017编译使用jsoncpp

右键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;
}

      运行结果:

vs2017编译使用jsoncpp