JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp是c++解析JSON串常用的解析库之一。

jsoncpp中主要的类:

Json::Value:可以表示所有支持的类型,如:int , double ,string , object, array等。其包含节点的类型判断(isNull,isBool,isInt,isArray,isMember,isValidIndex等),类型获取(type),类型转换(asInt,asString等),节点获取(get,[]),节点比较(重载<,<=,>,>=,==,!=),节点操作(compare,swap,removeMember,removeindex,append等)等函数。
Json::Reader:将文件流或字符串创解析到Json::Value中,主要使用parse函数。Json::Reader的构造函数还允许用户使用特性Features来自定义Json的严格等级。
Json::Writer:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读)

JsonCpp使用注意点:

1.对不存在的键获取值会返回此类型的默认值。
2.通过key获取value时,要先判断value的类型,使用错误的类型获取value会导致程序中断。
3.获取json数组中某一项key的value应该使用value[arraykey][index][subkey]获取或循环遍历数组获取。
4.append函数功能是将Json::Value添加到数组末尾。

5.由于Jsoncpp解析非法json时,会自动容错成字符类型。对字符类型取下标时,会触发assert终止进程。
解决方法:启用严格模式,让非法的json解析时直接返回false,不自动容错。这样,在调用parse的时候就会返回false。

  1. Json::Reader *pJsonParser = new Json::Reader(Json::Features::strictMode());

判断json字符串中是否存在某键值的几种方法:

  1. .value.isMember("key"); //存在返回true,否则为false
  2. .value["sex"].isNull(); //为NULL返回1,否则为0

JsonCpp读写示例代码:

  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <json/json.h>
  5.  
  6. void readJsonFromFile()
  7. {
  8. std::ifstream ifs;
  9. ifs.open("a.json");
  10. std::stringstream buffer;
  11. buffer << ifs.rdbuf();
  12. ifs.close();
  13.  
  14. auto str = buffer.str();
  15.  
  16. Json::Reader reader;
  17. Json::Value value;
  18. if (reader.parse(str, value)) {
  19. //节点判断
  20. std::cout << "value's empty:" << value.empty() << std::endl;
  21. std::cout << "name is string:" << value["name"].isString() << std::endl;
  22. std::cout << "age is string:" << value["age"].isString() << std::endl;
  23.  
  24. //类型获取
  25. std::cout << "name's type:" << value["name"].type() << std::endl;
  26. std::cout << "like's type:" << value["like"].type() << std::endl;
  27.  
  28. //类型转换
  29. //根据Key获取值时最好判断类型,否则解析会中断
  30. std::cout << "name:" << value["name"].asString() << std::endl;
  31. std::cout << "age:" << value["age"].asInt() << std::endl;
  32.  
  33. //节点获取
  34. std::cout << value["job"] << std::endl; //[]方式获取
  35. std::cout << value.get("name", "dxx") << std::endl; //get方式获取
  36. std::cout << value.isMember("job") << std::endl;
  37. std::cout << "value's obj:" << value.isObject() << std::endl;
  38. std::cout << "like's obj:" << value["like"].isObject() << std::endl;
  39. std::cout << "like.size:" << value["like"].size() << std::endl;
  40. std::cout << "like[0][food]:" << value["like"][]["food"].asString() << std::endl;
  41.  
  42. //节点操作
  43. std::cout << "name compare age:" << value["name"].compare("age") << std::endl;
  44. value["name"] = "swduan"; //修改
  45. value["address"] = "hz"; //增加
  46. value["phone"] = "";
  47. value.removeMember("age"); //删除
  48. value["like"][]["sport"] = "game"; //往value["like"]中添加一项元素
  49.  
  50. Json::Value item;
  51. item["hate"] = "game";
  52. value["like"].append(item); //value["like"]中再添加一维数组
  53. std::cout << "value[\"like\"]'s size:" << value["like"].size() << std::endl;
  54.  
  55. std::cout << "--------------------" << std::endl;
  56. std::cout << value.toStyledString() << std::endl;
  57.  
  58. std::cout << "--------------------" << std::endl;
  59. auto all_member = value.getMemberNames();
  60. for (auto member : all_member) {
  61. std::cout << member << std::endl;
  62. }
  63.  
  64. std::cout << "--------------------" << std::endl;
  65. value.clear(); //清空元素
  66. std::cout << value.toStyledString() << std::endl;
  67. }
  68. }
  69.  
  70. void jsonWriteToFile()
  71. {
  72. Json::FastWriter write;
  73. Json::Value root;
  74.  
  75. Json::Value item;
  76. Json::Value arrayObj;
  77. item["book"] = "c++";
  78. item["food"] = "apple";
  79. item["music"] = "ddx";
  80. arrayObj.append(item);
  81.  
  82. root["name"] = "dsw";
  83. root["age"] = ;
  84. root["like"] = arrayObj; //注意:这里不能用append,append功能是将Json::Value添加到数组末尾
  85.  
  86. auto str = root.toStyledString();
  87. std::cout << str << std::endl;
  88.  
  89. std::ofstream ofss;
  90. ofss.open("a.json");
  91. ofss << str;
  92. ofss.close();
  93. }
  94.  
  95. int main()
  96. {
  97. jsonWriteToFile();
  98. readJsonFromFile();
  99.  
  100. getchar();
  101. return ;
  102. }

输出:

  1. value's empty:0
  2. name is string:
  3. age is string:
  4. name's type:4
  5. like's type:6
  6. name:dsw
  7. age:
  8. null
  9. "dsw"
  10.  
  11. value's obj:1
  12. like's obj:0
  13. like.size:
  14. like[][food]:apple
  15. name compare age:
  16. value["like"]'s size:2
  17. --------------------
  18. {
  19. "address" : "hz",
  20. "job" : null,
  21. "like" : [
  22. {
  23. "book" : "c++",
  24. "food" : "apple",
  25. "music" : "ddx",
  26. "sport" : "game"
  27. },
  28. {
  29. "hate" : "game"
  30. }
  31. ],
  32. "name" : "swduan",
  33. "phone" : ""
  34. }
  35.  
  36. --------------------
  37. address
  38. job
  39. like
  40. name
  41. phone
  42. --------------------
  43. {}

JsonCpp 的使用的更多相关文章

  1. C++处理Json串——jsoncpp库

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...

  2. Json---使用Jsoncpp解析与写入

    上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1.首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k. ...

  3. 【003:jsoncpp的简单使用】

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

  4. jsoncpp初使用

    一 前言 由于最近一个c++项目需要使用json这种数据格式来传输数据, so上网去寻找合适的类库,毕竟对于这种不是很新的技术, 自己造轮子有点得不偿失. 从百度上翻了翻, 基本上就boost跟jso ...

  5. Jsoncpp Compiler、Programming

    catalog . C++ jsoncpp简介 . Jsoncpp的下载与编译 . Linux Jsoncpp的SDK编译 & 简单实例 . Windows Jsoncpp的SDK编译 &am ...

  6. jsoncpp操作 json

    jsoncpp操作 json 博客分类: c/c++ object-c 之 iphone   #include <iostream> //#include "json/json. ...

  7. JsonCpp简单使用

    作者:ilife JsonCpp简单使用 1.相关概念总结 (1)解析json的方法 Json::Value json;     //表示一个json格式的对象 Json::Reader reader ...

  8. JsonCpp的简单使用方法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  9. C++ JsonCpp 使用(含源码下载)

    C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...

  10. C++之jsoncpp学习

    最新由于客户端要用到jsoncpp,所以自己也跟着项目的需求学了一下jsoncpp.以前没用过xml,但是感觉接触json后,还蛮好用的. 参考地址 http://jsoncpp.sourceforg ...

随机推荐

  1. 分布式系统理论--CAP理论、BASE理论

    问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...

  2. ubuntu 18图形界面

    sh .start_mode.sh: 换操作方式(图形界面,终端界面): 桌面版: 界面中 ctrl + shift + t 打开终端 ctrl + shift + "+" 放大字 ...

  3. def 函数的不定长函数

    *args 不定长函数传值可直接传,也可以拆包传,参数默认为元组: 参数为字典的时候:

  4. 聊聊kafka结构

    因为kafka用到的地方比较多,日志收集.数据同步等,所以咱们来聊聊kafka. 首先先看看kafaka的结构,producer将消息放到一个Topic然后push到broker,然后cosumer从 ...

  5. js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

    日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...

  6. [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]

    这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...

  7. cf348D. Turtles(LGV定理 dp)

    题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...

  8. swoole深入学习 4. process

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...

  9. tab------左右布局

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  10. Structured Streaming教程(1) —— 基本概念与使用

    近年来,大数据的计算引擎越来越受到关注,spark作为最受欢迎的大数据计算框架,也在不断的学习和完善中.在Spark2.x中,新开放了一个基于DataFrame的无下限的流式处理组件--Structu ...