JsonCpp 的使用
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。
- Json::Reader *pJsonParser = new Json::Reader(Json::Features::strictMode());
判断json字符串中是否存在某键值的几种方法:
- .value.isMember("key"); //存在返回true,否则为false
- .value["sex"].isNull(); //为NULL返回1,否则为0
JsonCpp读写示例代码:
- #include <iostream>
- #include <sstream>
- #include <fstream>
- #include <json/json.h>
- void readJsonFromFile()
- {
- std::ifstream ifs;
- ifs.open("a.json");
- std::stringstream buffer;
- buffer << ifs.rdbuf();
- ifs.close();
- auto str = buffer.str();
- Json::Reader reader;
- Json::Value value;
- if (reader.parse(str, value)) {
- //节点判断
- std::cout << "value's empty:" << value.empty() << std::endl;
- std::cout << "name is string:" << value["name"].isString() << std::endl;
- std::cout << "age is string:" << value["age"].isString() << std::endl;
- //类型获取
- std::cout << "name's type:" << value["name"].type() << std::endl;
- std::cout << "like's type:" << value["like"].type() << std::endl;
- //类型转换
- //根据Key获取值时最好判断类型,否则解析会中断
- std::cout << "name:" << value["name"].asString() << std::endl;
- std::cout << "age:" << value["age"].asInt() << std::endl;
- //节点获取
- std::cout << value["job"] << std::endl; //[]方式获取
- std::cout << value.get("name", "dxx") << std::endl; //get方式获取
- std::cout << value.isMember("job") << std::endl;
- std::cout << "value's obj:" << value.isObject() << std::endl;
- std::cout << "like's obj:" << value["like"].isObject() << std::endl;
- std::cout << "like.size:" << value["like"].size() << std::endl;
- std::cout << "like[0][food]:" << value["like"][]["food"].asString() << std::endl;
- //节点操作
- std::cout << "name compare age:" << value["name"].compare("age") << std::endl;
- value["name"] = "swduan"; //修改
- value["address"] = "hz"; //增加
- value["phone"] = "";
- value.removeMember("age"); //删除
- value["like"][]["sport"] = "game"; //往value["like"]中添加一项元素
- Json::Value item;
- item["hate"] = "game";
- value["like"].append(item); //value["like"]中再添加一维数组
- std::cout << "value[\"like\"]'s size:" << value["like"].size() << std::endl;
- std::cout << "--------------------" << std::endl;
- std::cout << value.toStyledString() << std::endl;
- std::cout << "--------------------" << std::endl;
- auto all_member = value.getMemberNames();
- for (auto member : all_member) {
- std::cout << member << std::endl;
- }
- std::cout << "--------------------" << std::endl;
- value.clear(); //清空元素
- std::cout << value.toStyledString() << std::endl;
- }
- }
- void jsonWriteToFile()
- {
- Json::FastWriter write;
- Json::Value root;
- Json::Value item;
- Json::Value arrayObj;
- item["book"] = "c++";
- item["food"] = "apple";
- item["music"] = "ddx";
- arrayObj.append(item);
- root["name"] = "dsw";
- root["age"] = ;
- root["like"] = arrayObj; //注意:这里不能用append,append功能是将Json::Value添加到数组末尾
- auto str = root.toStyledString();
- std::cout << str << std::endl;
- std::ofstream ofss;
- ofss.open("a.json");
- ofss << str;
- ofss.close();
- }
- int main()
- {
- jsonWriteToFile();
- readJsonFromFile();
- getchar();
- return ;
- }
输出:
- value's empty:0
- name is string:
- age is string:
- name's type:4
- like's type:6
- name:dsw
- age:
- null
- "dsw"
- value's obj:1
- like's obj:0
- like.size:
- like[][food]:apple
- name compare age:
- value["like"]'s size:2
- --------------------
- {
- "address" : "hz",
- "job" : null,
- "like" : [
- {
- "book" : "c++",
- "food" : "apple",
- "music" : "ddx",
- "sport" : "game"
- },
- {
- "hate" : "game"
- }
- ],
- "name" : "swduan",
- "phone" : ""
- }
- --------------------
- address
- job
- like
- name
- phone
- --------------------
- {}
JsonCpp 的使用的更多相关文章
- C++处理Json串——jsoncpp库
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...
- Json---使用Jsoncpp解析与写入
上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1.首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k. ...
- 【003:jsoncpp的简单使用】
#include <json/json.h> #include <iostream> #include <string> using namespace std; ...
- jsoncpp初使用
一 前言 由于最近一个c++项目需要使用json这种数据格式来传输数据, so上网去寻找合适的类库,毕竟对于这种不是很新的技术, 自己造轮子有点得不偿失. 从百度上翻了翻, 基本上就boost跟jso ...
- Jsoncpp Compiler、Programming
catalog . C++ jsoncpp简介 . Jsoncpp的下载与编译 . Linux Jsoncpp的SDK编译 & 简单实例 . Windows Jsoncpp的SDK编译 &am ...
- jsoncpp操作 json
jsoncpp操作 json 博客分类: c/c++ object-c 之 iphone #include <iostream> //#include "json/json. ...
- JsonCpp简单使用
作者:ilife JsonCpp简单使用 1.相关概念总结 (1)解析json的方法 Json::Value json; //表示一个json格式的对象 Json::Reader reader ...
- JsonCpp的简单使用方法
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...
- C++ JsonCpp 使用(含源码下载)
C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...
- C++之jsoncpp学习
最新由于客户端要用到jsoncpp,所以自己也跟着项目的需求学了一下jsoncpp.以前没用过xml,但是感觉接触json后,还蛮好用的. 参考地址 http://jsoncpp.sourceforg ...
随机推荐
- 分布式系统理论--CAP理论、BASE理论
问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...
- ubuntu 18图形界面
sh .start_mode.sh: 换操作方式(图形界面,终端界面): 桌面版: 界面中 ctrl + shift + t 打开终端 ctrl + shift + "+" 放大字 ...
- def 函数的不定长函数
*args 不定长函数传值可直接传,也可以拆包传,参数默认为元组: 参数为字典的时候:
- 聊聊kafka结构
因为kafka用到的地方比较多,日志收集.数据同步等,所以咱们来聊聊kafka. 首先先看看kafaka的结构,producer将消息放到一个Topic然后push到broker,然后cosumer从 ...
- js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?
日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...
- [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]
这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...
- cf348D. Turtles(LGV定理 dp)
题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...
- swoole深入学习 4. process
swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...
- tab------左右布局
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- Structured Streaming教程(1) —— 基本概念与使用
近年来,大数据的计算引擎越来越受到关注,spark作为最受欢迎的大数据计算框架,也在不断的学习和完善中.在Spark2.x中,新开放了一个基于DataFrame的无下限的流式处理组件--Structu ...