[时间: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用法的更多相关文章

  1. C++ Json工具--Jsoncpp用法简介

    文章目录 Json简介 用法简介 数据类型 C++代码示例 代码执行输出结果 JSON在线解析及格式化验证 - JSON.cn Json简介 JSON(JavaScript Object Notati ...

  2. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  3. C# JSON格式数据高级用法

     JSON简介 JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集.JSON采用完全独立于语言的文本格式, ...

  4. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  5. boost json生成和解析用法

    json c++库还是有很多的,因为工作上经常使用boost,这里选用boost的json,记录下用法. 举个栗子: 如果我们要生成如下格式的json: { "name":&quo ...

  6. c++ - Create empty json array with jsoncpp - Stack Overflow

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     multiprocessing.pool c++ - Create empty json array wit ...

  7. iOSXML & JSON 简介

    XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...

  8. JSON 简介

    ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...

  9. jquery下json数组的操作用法实例

    jquery下json数组的操作用法实例: jquery中操作JSON数组的情况中遍历方法用的比较多,但用添加移除这些好像就不是太多了. 试过json[i].remove(),json.remove( ...

随机推荐

  1. ASP.net MVC把Html Table导出Excel

    [HttpPost] public ActionResult ExportExcel(FormCollection form) { string strHtml = form["hHtml& ...

  2. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  3. [BZOJ2650]积木

    [BZOJ2650]积木 题目大意: 有一排\(n\)个积木,第\(i\)个积木的高度为\(h_i\),定义混乱值为相邻两个积木高度之差的绝对值之和乘上系数\(c\).可以花费\(t^2\)的代价将一 ...

  4. Java API概述

    collection of APIs(Application Programming Interface) java.lang — automatically imported into Java p ...

  5. 工具类TestTools

    一些方法可能要使用到该工具类,该工具类中的方法包括从链接数据库到数据表中记录的增删改查. package JDBCTest; import java.io.InputStream; import ja ...

  6. iptables为什么需要增加loopback回环的规则

    先说loopback回环的大致个人理解: 1.lo的主要作用是基于本地访问本地的数据包会经过lo这张网卡. 2.比如ping 127.0.0.1时,你在eth0抓不到,只能在lo这张网卡捕获. 再来看 ...

  7. p4 环境变量的优先级

    Perforce settings such as port, user, and workspace names using the following methods, listed in ord ...

  8. tomcat管理页面403 Access Denied的解决方法

    安装tomcat,配置好tomcat环境变量以后,访问manager app页面,出现403 Access Denied错误,解决的方法如下: 首先在conf/tomcat-users.xml文件里面 ...

  9. Go学习入门

    1. 为什么要学习Go Go语言宣称为互联网时代的C语言,那她有那些特性值得我们必须学习呢: 并行与分布式支持.除了我们日常熟悉的进程和线程,Go语言中提供了协程coroutine,从而简化了并行开发 ...

  10. Java -Dfile.encoding=UTF-8 干掉乱码

    遭遇乱码问题的来龙去脉 这两天写了一个 Java 程序来玩,结果又遭遇了以前遇到过很多次的乱码问题,具体描述一下:在 Mac 系统里面,常用的 Java 程序启动方式有如下几种:1.通过 eclips ...