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 的使用的更多相关文章

  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. POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)

    <题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...

  2. SpringBoot+Mybatis多模块(module)项目搭建教程

    一.前言 最近公司项目准备开始重构,框架选定为SpringBoot+Mybatis,本篇主要记录了在IDEA中搭建SpringBoot多模块项目的过程. 1.开发工具及系统环境 IDE:Intelli ...

  3. 目标检测——IoU 计算

    Iou 的计算 我们先考虑一维的情况:令 \(A = [x_1,x_2], B = [y_1, y_2]\),若想要 \(A\) 与 \(B\) 有交集,需要满足如下情况: 简言之,要保证 \(A\) ...

  4. 幕布V1.1.9最新版漏洞集合

    0X00 前言 幕布本人最早接触是在P神的知识星球里面看到P神推荐的,后来下了个用着还挺好用. 之前一直都放一些零零散散的笔记,最近整理的时候,一时兴起,本着漏洞源于生活的态度,遂对幕布的安全性做了些 ...

  5. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

  6. BZOJ.5404.party(树链剖分 bitset Hall定理)

    题目链接 只有指向父节点的单向道路,所以c个人肯定在LCA处汇合.那么就成了有c条到LCA的路径,求最大的x,满足能从c条路径中各选出x个数,且它们不同. 先要维护一条路径的数的种类数,可以树剖+每条 ...

  7. 洛谷.2051.[AHOI2009]中国象棋(DP)

    题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...

  8. [CF920G]List Of Integers

    Description: \(t\)组询问,求第\(k\)个大于\(x\)且与\(p\)互质的数 Hint: \(x,k,p<=1e6,t<=30000\) Solution: 推出式子后 ...

  9. [Visual Studio] 未能完成操作 不支持此接口

    vs2017添加引用时提示“未能完成操作 不支持此接口”, 一般情况下的处理办法:vs2017修复.修复是指重新安装,修改是指版本更新. 如果修复后仍然存在该问题,说明vs2017安装成功后部分功能未 ...

  10. Django的使用规则

    ORM应该算是Python的一大特色,功能类似于Mybatis或hibernate,但是显示要强大更多 一:terminal下命令行的使用 1.创建一个Project django-admin sta ...