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字符串(含数组) 

#include
#include
#include 
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"节点下为数组arrayLinuxJson::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;  // 根节点// 解析JSONif (!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();}

 结果:

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部