参考自: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 类来适配。
编译:
- 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz
- 利用VS打开jsoncpp-src-0.5.0\makefiles\vs71目录下的jsoncpp.sln,会出现三个Project:jsontest, lib_json, test_lib_json
- 检查设置:在lib_json上右击-->Properties-->Configuration Properties-->C/C++-->Code Generation,检查设置是否为RunTime Library 为MTD
- 切换配置中需要生成的平台,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();
}
结果: