json简介及JsonCpp用法
[时间:2017-04] [状态:Open]
[关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource]
json简介
本文仅仅是添加我个人对json格式的理解,更详细的格式建议参考官网的JSON介绍及标准文档。
json中仅支持两种结构:
- name->value键值对(pair)的集合,一般称为对象(object)。
- 值的有序表,一般称为数组(array)。
1. pair
先从键值对(pair)开始,一个pair的通常结构是:
string
:value
键值之间的对应关系使用:
表示,左边的为name,右边的为value。
一般key使用字符串,当然也可以使用数字,但是不推荐。
value的取值就比较随便,可以是任何任何json支持的类型(比如object,array,string,number,true/false,null等)。
2. object
object可以认为是多个pair的集合,官网上给出的示意图如下:
其语法是以{
作为object开始,以}
作为object结束,不同的pair之间使用,
分割。
需要说明的是object中的数据存储是无序的。
下面是一个比较典型的object构成
{
"name" : "tocy",
"age" : 1000
}
3. array
array是value的有序集合。先看官网上针对array结构的示意图:
其语法是以[
作为array起始,以]
作为array结束,array元素之间使用,
分割。
实际使用中建议在array中使用统一的类型,否则解析起来会麻烦点。
比如下面语法是合法的:
[{"name":"tocy"}, {"age":1000}, {"domain":"cn"}]
当然下面这种写法也是可以的,[1, "ts", true, {"key":45}]
至于其他的string和number支持的格式,建议参考json官方介绍。
JsonCpp的使用
json的官网上有很多关于json解析的工具,可以从中选择一个你喜欢的。
我主要在c++下使用json,我选择了JsonCpp,官网是:https://github.com/open-source-parsers/jsoncpp。
下载完源码之后为了使用方便,直接将源码嵌入到工程中,进入源码所在目录,先生成一个完整的头文件和cpp文件,命令如下:
python amalgamate.py
然后将dist文件夹拷贝到工程目录就可以使用了。(包含json/json.h、json/json-forwards.h、json.cpp)
注意:本部分用例代码可能为了简化期间,并未做错误异常判断,仅供参考。
示例1 从文件中读取json文件并解析
首先我们提供一个json文件,这里命名为"checkjson.json",其中数据如下:
{
"name" : "tocy",
"age" : 1000
}
这里面保存的是最简单的object,我们可以使用下面代码将其读入并解析:
void demo_simple()
{
ifstream ifs;
ifs.open("checkjson.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
cerr << "parse failed \n";
return;
}
string name = root["name"].asString(); // 实际字段保存在这里
int age = root["age"].asInt(); // 这是整型,转化是指定类型
}
这里是简单的map访问,然后直接读取对应字段即可。
示例2 从内存中读取json数据(object)
我们在内存中定义一段json数据,然后解析,这次我们在json中添加内嵌array的object。代码如下:
void demo_parse_mem_object()
{
const char json_data[] =
"{\"name\" : \"Tocy\", \"salary\" : 100, \"msg\" : \"work hard\", \
\"files\" : [\"1.ts\", \"2.txt\"]}";
Json::Reader reader;
Json::Value root;
// reader将Json字符串解析到root,root将包含Json里所有子元素
if (!reader.parse(json_data, json_data + sizeof(json_data), root))
{
cerr << "json parse failed\n";
return;
}
cout << "demo read from memory ---------\n";
string name = root["name"].asString();
int salary = root["salary"].asInt();
string msg = root["msg"].asString();
cout << "name: " << name << " salary: " << salary;
cout << " msg: " << msg << endl;
cout << "enter files: \n";
Json::Value files = root["files"]; // read array here
for (unsigned int i = 0; i < files.size(); ++i)
{
cout << files[i].asString() << " ";
}
cout << endl << endl;
}
示例3 从内存中解析json数据(array)
这次我们从提供一个以array封装的json数据,解析逻辑如下:
void demo_parse_mem_array()
{
const char json_data[] =
"[{\"name\" : \"Tocy\", \"salary\" : 100}, {\"name\" : \"Kit\", \"salary\" : 89}, \
\"a json note\"]";
Json::Reader reader;
Json::Value root;
// reader将Json字符串解析到root,root将包含Json里所有子元素
if (!reader.parse(json_data, json_data + sizeof(json_data), root))
{
cerr << "json parse failed\n";
return;
}
cout << "demo read from memory using array---------\n";
unsigned int count = root.size() - 1;
for (unsigned int i = 0; i < count; ++i)
{
string name = root[i]["name"].asString();
int salary = root[i]["salary"].asInt();
cout << "name: " << name << " salary: " << salary << endl;
}
cout << "last msg: " << root[count].asString() << endl;
cout << endl << endl;
}
示例4 简单json数据封装
前面三个是关于json数据解析的例子,下面是关于json数据封装的例子。
首先我们生成示例1的数据,代码如下:
void demo_write_simple()
{
Json::Value root;
Json::FastWriter writer;
Json::Value person;
person["name"] = "tocy";
person["age"] = 1000;
root.append(person);
string json_file = writer.write(root);
cout << "demo write json ==============\n";
cout << json_file << endl;
}
示例5 json封装-内嵌array的object
首先我们生成示例2的数据,代码如下:
void demo_write_object()
{
Json::Value root;
Json::FastWriter writer;
root["name"] = "tocy";
root["salary"] = 100;
root["msg"] = "work hard";
Json::Value files;
files[0] = "1.ts";
files[1] = "2.txt";
root["files"] = files;
string json_file = writer.write(root);
cout << "demo write json object ==============\n";
cout << json_file << endl;
}
示例6 json封装-内嵌object的array
首先我们生成示例3的数据,代码如下:
void demo_write_array()
{
Json::Value root;
Json::FastWriter writer;
{
Json::Value person;
person["name"] = "Tocy";
person["salary"] = 100;
root[0] = person;
}
{
Json::Value person;
person["name"] = "Kit";
person["salary"] = 89;
root[1] = person;
}
root[2] = "a json note";
string json_file = writer.write(root);
cout << "demo write json ==============\n";
cout << json_file << endl;
}
小结
本文简单整理了json相关格式。同时针对JsonCpp的用法做简单总结,仅供参考。
本文相关源码,可以从我的git下载,位于JsonCppTutorial目录下。
json简介及JsonCpp用法的更多相关文章
- C++ Json工具--Jsoncpp用法简介
文章目录 Json简介 用法简介 数据类型 C++代码示例 代码执行输出结果 JSON在线解析及格式化验证 - JSON.cn Json简介 JSON(JavaScript Object Notati ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- C# JSON格式数据高级用法
JSON简介 JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集.JSON采用完全独立于语言的文本格式, ...
- 关于 pgsql 数据库json几个函数用法的效率测试
关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...
- boost json生成和解析用法
json c++库还是有很多的,因为工作上经常使用boost,这里选用boost的json,记录下用法. 举个栗子: 如果我们要生成如下格式的json: { "name":&quo ...
- c++ - Create empty json array with jsoncpp - Stack Overflow
python中multiprocessing.pool函数介绍_正在拉磨_新浪博客 multiprocessing.pool c++ - Create empty json array wit ...
- iOSXML & JSON 简介
XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...
- JSON 简介
ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...
- jquery下json数组的操作用法实例
jquery下json数组的操作用法实例: jquery中操作JSON数组的情况中遍历方法用的比较多,但用添加移除这些好像就不是太多了. 试过json[i].remove(),json.remove( ...
随机推荐
- python tkinter-布局
包装布局pack() 目前对它的感觉是,当一个窗体的对象都设置完属性后,最后用它来绑定到窗体上.之后就不能再设置属性了 名称 描述 取值范围 expand 当值为“yes”时,side选项无效.组 ...
- linux学习之使用fdisk命令进行磁盘分区(八)
linux下使用fdisk命令进行磁盘分区 目录 分区类型 分区方法表示 文件系统 fdisk命令分区过程 分区类型 主分区:总共最多只能分四个 扩展分区:只能有一个,也算作主分区的一种,也就是说主分 ...
- Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么
Android7.0 PopupWindow的兼容问题 Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...
- vim编辑器基本操作
命令模式: 按(i)键进入编辑模式,将在光标前面插入: 按(I)键进入编辑模式,将在光标行首插入: 按(a)进入编辑模式,在光标后面插入: 按(A)键进入编辑模式,将在光标行末插入: 按(o)进入编辑 ...
- mac下配置Apache虚拟域名方案,以及遇到的坑
1. 配置Apache虚拟域名 1.执行 sudo vi /etc/apache2/httpd.conf 开始配置httpd.conf 的文件; //配置listen 80端口(默认配置), ...
- 51nod 1277 字符串中的最大值
题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...
- Python图形编程探索系列-04-网上图片与标签组件的结合
跳转到自己的博客 任务设定 任务:从网上找到一张图片,然后将其显示在标签上? 网上图片网站:http://pic.58pic.com/58pic/17/56/38/52w58PICtER_1024.j ...
- swoole深入学习 4. process
swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...
- 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
A题 喵哈哈村的数据筛选游戏 题解:这道题签到题,拿个数组记录一下这个数是否出现过即可. #include<bits/stdc++.h> using namespace std; cons ...
- .Net Core Md5加密整理
一..Net Core中Md5使用说明 .Net Core中自带Md5加密处理,使用方法和 .Net Framework中相同 所在命名空间 using System.Security.Cryptog ...