jsoncpp读写json

参考自:https://www.cnblogs.com/liaocheng/p/4243731.html

              https://www.cnblogs.com/hpcpp/p/7889456.html

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似。

Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/

jsoncpp 使用说明:

jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。

jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。

Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

编译: 

  1. 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz
  2. 利用VS打开jsoncpp-src-0.5.0\makefiles\vs71目录下的jsoncpp.sln,会出现三个Project:jsontest, lib_json, test_lib_json
  3. 检查设置:在lib_json上右击-->Properties-->Configuration Properties-->C/C++-->Code Generation,检查设置是否为RunTime  Library  为MTD  
  4. 切换配置中需要生成的平台,win32还是x64,debug版本还是release版本

关于MT/MTd/MD/MDd的选择参考下图: 

以下示例是在VS2008中使用Jsoncpp解析json的方法做一下记录:

项目配置时注意:属性配置--> C++--> Code Generation -->RunTime  Library  为 MTD,否则很多"LNK"错误

1.读取Json字符串(含数组) 

//构造一个json字符串,里面含有数组。("\"为转义字符,每行最后一个"\"用作字符串换行连接)
string str="{\"id\":\"928379812\",\
	     \"ip\":\"192.190.110.111\",\
	     \"systemType\":\"Windows\",\
	     \"version\":\"1.5.0.0.9-20190410-4\",\
	     \"path\":\"Updates\",\
	     \"hostIdList\":[\
				{\"hostId\":\"aaaaa\"}, \
				{\"hostId\":\"bbbbb\"},\
				{\"hostId\":\"ccccc\"}\
			    ]\
	    }";


	
        Json::Reader reader; // 解析器
        Json::Value root;  // 根节点

         // 解析JSON
        if (!reader.parse(str, root, false))
        {
             return FALSE;
        }
    
        //获取根节点个数
	int nNodeCount = root.size();
	cout << "node count:" << nNodeCount<<endl;
	
	//获取每个根节点的名字
	cout << "\nname of key as follows:" << endl;
	vector<string> vecNodeName = root.getMemberNames();
	for (int i = 0; i < nNodeCount; i++)
		cout <<vecNodeName.at(i) << endl;

	cout << "\nkey and value as follows:" << endl;
	//获取节点值
	string m_strID = root["id"].asString();
	cout << "ID: " << m_strID << endl;

	string m_strSystemType = root["systemType"].asString();
	cout << "systemType: " << m_strSystemType << endl;

	string m_strVersion = root["version"].asString();
	cout << "version: " << m_strVersion << endl;

	string m_strPath = root["path"].asString();
	cout << "path: " << m_strPath << endl;

	string m_strIP = root["ip"].asString();
	cout << "IP: " << m_strIP << endl;

	//**************解析数组*****************
	Json::Value arrayObj = root["hostIdList"];
	cout << "\narray_size: " << arrayObj.size() << endl;
	//索引只能是int型,如果用size_t会报错
	for (int i = 0; i < arrayObj.size(); i++)
	{
		string strTmp = arrayObj[i]["hostId"].asString();
		cout << "array" << i << ": " << strTmp << endl;

	}

程序输出如下:

2向文件中插入json(添加数组项)

原文件如下:

代码:

#include<iostream>
#include<fstream>
#include <json.h>
using namespace std;

int main()
{

	Json::Reader reader;
	Json::Value root;     

	std::ifstream is;
	is.open("D:/temp.json", std::ios::binary);
	if (reader.parse(is, root))
	{
		//添加"Window"节点下数组成员
		Json::Value arrayWin=root["Windows"];   // 获取原"Windows" 节点下的数组
		Json::Value new_item;
		new_item["hostId"] = "Win5555555555";   //构建数组成员
		arrayWin.append(new_item);  // 插入数组成员  
		root["Windows"] = arrayWin;  //"Windows"节点下为新arrayWin

		//添加"Linux"节点,并在它的节点下添加数组成员
		Json::Value arrayLinux;   
		Json::Value new_item1,new_item2;
		new_item1["hostId"] = "Linux111";   //构建数组成员
		new_item2["hostId"] = "Linux222";
		arrayLinux.append(new_item1);  // 插入数组成员  
		arrayLinux.append(new_item2);  
		root["Linux"] = arrayLinux;  //"Linux"节点下为数组arrayLinux
		
		Json::StyledWriter writer;
		std::string strWrite = writer.write(root);
		std::ofstream ofs;
		ofs.open("D:/temp.json");
		ofs << strWrite;
		ofs.close();
	}
	return 0;
}

结果:

添加复杂数组:

string str = "{\
			\"IP\":\"127.0.0.1\",\
			\"hostidList\":[\
				{\"hostId\":\"aaaaa\",\"version\":\"v1\"}, \
				{\"hostId\":\"bbbbb\",\"version\":\"v2\"},\
				{\"hostId\":\"ccccc\",\"version\":\"v3\"}\
			  ]\
	    }";

	Json::Reader reader; // 解析器
	Json::Value root;  // 根节点

	// 解析JSON
	if (!reader.parse(str, root, false))
	{
		return 0;
	}

	Json::Value item1,item2;
	Json::Value arrayObj = root["hostidList"];
	item1["hostId"] = "ddd";
	item1["version"] = "v4";
	item2["hostId"] = "eee";
	item2["version"] = "v5";
	arrayObj.append(item1);
	arrayObj.append(item2);
	root["hostidList"] = arrayObj;
	cout << root << endl;

结果:

3.删除文件中json节点(删除数组项)

原文如下:

现删除“Mac”节点及该节点下的所有元素

并删除"Windows"节点下"hostId"为"win222"的元素

代码:

        Json::Reader reader;
	Json::Value root;     

	std::ifstream is;
	is.open("D:/temp.json", std::ios::binary);
	if (reader.parse(is, root))
	{
			Json::Value arrayObj=root["Windows"];   // 获取原"Windows" 节点下的数组
			//删除"Windows"节点下"hostid"为"win222"的数组成员
			for (int i = 0; i < arrayObj.size(); i++)
			{
				string strTemp = arrayObj[i]["hostId"].asString();
				if (strTemp == "win222")
					arrayObj[i].removeMember("hostId");  //移除当前成员
			}
			root["Windows"] = arrayObj;  //"Windows"节点下为新arrayObj

			//删除"Mac"节点及其节点下的所有元素
			root.removeMember("Mac");

			Json::StyledWriter writer;
			std::string strWrite = writer.write(root);
			std::ofstream ofs;
			ofs.open("D:/temp.json");
			ofs << strWrite;
			ofs.close();
	}

 结果:

猜你喜欢

转载自blog.csdn.net/andylanzhiyong/article/details/90207564