C++ Json解析库Jsoncpp下载+编译+使用
C++ Json解析库Jsoncpp下载+编译+使用
文章目录
- C++ Json解析库Jsoncpp下载+编译+使用
- 一、 Json
- 1.定义
- 2.格式
- 3.示例
- 4.类型
- 二、Jsoncpp
- 1.介绍
- 2.下载
- 3.编译和使用
- 三、C++ Jsoncpp解析Json对象
- 1.json格式:键-值的一重嵌套
- 2.json格式:数组
- 3.json格式:数组2
- 4.json格式:多重嵌套
- 四、C++ Jsoncpp生成Json对象
- 1.json格式:键-值的一重嵌套
- 2.json格式:数组
- 3.json格式:数组2
- 4.json格式:多重嵌套
- 五、Chromium 中使用Jsoncpp
- 1.添加头文件
- 2.在BUILD.gn中添加deps
- 3.编译
一、 Json
1.定义
什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言
- JSON 具有自我描述性,更易理解
- JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
w3c的标准说明如下:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使json成为理想的数据交换语言。
所以几乎所有的语言都会有支持json格式转化的库。
2.格式
json的格式只有两种,所以非常简单方便:
键值对
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;“键值对”之间使用“,”分隔。
数组
数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。
3.示例
{
"employees": [
{
"firstName": "Bill",
"lastName": "Gates"
},
{
"firstName": "George",
"lastName": "Bush"
},
{
"firstName": "Thomas",
"lastName": "Carter"
}
]
}
要注意的是,每一个非数值的字符串都应当带引号,否则标准的解析库是无法解析的。
网上也有很多json的在线格式化的网站,在遇到json无法解析的时候可以去那里找找错。
4.类型
最后需要注意的是,json里的数字都是双精浮点数,因此无法精确的表示 Long 型。在存储大 Long 型数据的时候要小心,不要丢失精度了。
二、Jsoncpp
1.介绍
JSON全称为JavaScript Object Notation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。Jsoncpp是c++解析JSON串常用的解析库之一。
2.下载
目前代码维护在github。
首先从github下载最新版zip:
https://github.com/open-source-parsers/jsoncpp/releases?spm=a2c4e.10696291.0.0.430919a44F1Wlf
接着,将其解压。
3.编译和使用
Win10 + VS2019 community。
步骤1:编译生成lib
在VS 2019中打开E:\jsoncpp-0.10.7\makefiles\msvc2010下的jsoncpp.sln。右键->重新生成解决方案。此时,会在目录jsoncpp-0.10.7\makefiles\msvc2010\Debug下生成lib_json.lib文件。
步骤2:将所需文件添加至自己的工程
将步骤1生成的lib_json.lib文件和目录jsoncpp-0.10.7下的include文件夹拷贝至自己的项目/工程目录下:
这时在vs的目录列表里是看不到这个目录的,在如下图工具栏中点击图标【显示所有文件】,就可以看到新增的目录了:
这时实际上还没有真正地加入到工程中来,相关图标是红色的,要在工程目录上右键选择【包括在项目中】即可。
步骤3:设置工程属性
工程必须是win32;
工程->属性->配置属性->c/c+±>代码生成->运行库,设置运行库为多线程调试 (/MTd);
步骤4:测试使用
在JsonTest2中JsonTest2.cpp中添加测试代码(写json文件):
#include <fstream>
#include "include/json/json.h"
using namespace std;
#pragma comment(lib, "json_vc71_libmtd.lib")
int main()
{ Json::Value root; root["occupatio"] = "paladin"; root["camp"] = "alliance"; root["role_id"] = 1; Json::StyledWriter writer; ofstream os; os.open("test.json"); os << writer.write(root); os.close(); return 0;
}
编译运行后,工程目录下生成test.json文件。
三、C++ Jsoncpp解析Json对象
1.json格式:键-值的一重嵌套
{ “id” : 123, "name" : "wu" }
我们直接将上面的数据初始化到到string对象中,方便解析,后面都是如此。
std::string json = "{\"id\" : 123, \"name\" : \"wu\"}"; Json::Reader reader;
Json::Value root;
std::string name;
int id = 0;
if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{ name = root["name"].asString(); id = root["id"].asInt();
}
2.json格式:数组
[ { "id" : 1, "name" : "wu"}, {"id":2, "name" : "tan"} ]
解析方法如下:
std::string json = "[ {\"id\" : 1, \"name\" : \"wu\"}, {\"id\" : 2, \"name\" : \"tan\"} ]"; Json::Reader reader;
Json::Value root;
std::string name;
int id = 0;
std::map<int, std::string> mapJson; if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{ for (int i = 0; i < root.size(); ++i) { name = root[i]["name"].asString(); id = root[i]["id"].asInt(); mapJson[id] = name; }
}
3.json格式:数组2
如果是这样的数组:
{ “id” : [1, 2], "name" : ["wu", "tan"] }
解析方法如下:
std::string json = "{\"id\" : [1, 2], \"name\" : [\"wu\", \"tan\"] } "; Json::Reader reader;
Json::Value root;
std::string name;
int id = 0; if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{ for (int i = 0; i < root["id"].size(); ++i) { id = root["id"][i].asInt(); } for (int i = 0; i < root["name"].size(); ++i) { name = root["name"][i].asString(); }
}
这种情况其实和上一种是类似的。
4.json格式:多重嵌套
为了简便,我们嵌套两层。
{ "id" : 1, "data" : { "name" : "wu", “age” : 26 } }
其实这种情况和第一种的类似,只是通过root[“key”]取到的还是键值对,继续通过key取值即可。
基本上再复杂的数据格式也是上面几种情况的组合而已。
解析方法如下:
std::string json = "{\"id\" : 1, \"data\" : { \"name\" : \"wu\", \"age\" : 26 } }"; Json::Reader reader;
Json::Value root;
std::string name;
int id = 0;
int age = 0; if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{ id = root["id"].asInt(); name = root["data"]["name"].asString(); age = root["data"]["age"].asInt();
}
四、C++ Jsoncpp生成Json对象
1.json格式:键-值的一重嵌套
{ “id” : 123, "name" : "wu" }
生成方法如下:
Json::Value root; root["id"] = 123;
root["name"] = "wu"; std::string json = root.toStyledString();
我们会将生成的json对象序列化到string对象中去,后面也是如此。
2.json格式:数组
[ { "id" : 1, "name" : "wu"}, {"id":2, "name" : "tan"} ]
生成方法如下:
Json::Value root; for (int i = 0; i < 2; ++i)
{ root[i]["id"] = i + 1; if (0 == i) { root[i]["name"] = "wu"; } else { root[i]["name"] = "tan"; }
} std::string json = root.toStyledString();
还可以这样生成:
Json::Value root;
Json::Value item; for (int i = 0; i < 2; ++i)
{ item["id"] = i + 1; if (0 == i) { item["name"] = "wu"; } else { item["name"] = "tan"; } root.append(item);
} std::string json = root.toStyledString();
3.json格式:数组2
1. {
2.
3. “id” : [1, 2],
4.
5. "name" : ["wu", "tan"]
6.
7. }
生成方法如下:
Json::Value root; for (int i = 0; i < 2; ++i)
{ root["id"].append(i); if (0 == i) { root["name"].append("wu"); } else { root["name"].append("tan"); } } std::string json = root.toStyledString();
4.json格式:多重嵌套
为了简便,我们嵌套两层。
{ "id" : 1, "data" : { "name" : "wu", “age” : 26 }
}
生成方法如下:
Json::Value root; root["id"] = 1;
root["data"]["name"] = "wu";
root["data"]["age"] = 26; std::string json = root.toStyledString();
其实解析和生成json是互逆的,只要明白这几种情况,其他的无非是这几种情况的各种组合,原理是一样的。
五、Chromium 中使用Jsoncpp
1.添加头文件
Jsoncpp为Chromium自带的第三方库,位于目录:src/third_party/jsoncpp。
使用时,需在当前模块的头文件中添加头文件:
#include "third_party/jsoncpp/source/include/json/json.h"
2.在BUILD.gn中添加deps
使用时,需在当前模块的BUILD.gn文件中添加deps:
deps += ["//third_party/jsoncpp",]
3.编译
需重新编译当前模块,假设当前模块为content:
ninja content
C++ Json解析库Jsoncpp下载+编译+使用相关推荐
- C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
- [转]C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
- C++的Json解析库:jsoncpp
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org/,本文不再对json做介绍,将重点介绍c++的 ...
- C++的Json解析库:jsoncpp和boost .
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org/,本文不再对json做介绍,将重点介绍c++的 ...
- C++ JSON解析之jsoncpp库的使用
C++ JSON解析之jsoncpp库的使用 1.介绍 轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,层次结构简洁清晰,易于人阅读和编写,易于机器解析和生成. 2.语法规则 ...
- 一个Json解析库的设计和实现
一个Json解析库的设计和实现 一个Json解析库的设计和实现 设计思路 实现方法 1. 预处理(去除注释) 2. 词法分析 3. 语法分析 4. 树型优化 5. Json树构建 6. 后端处理 整体 ...
- Android学习之Json解析库Gson
接着上一篇Volley,在使用Volley加载好数据之后,我们肯定不能直接使用这个数据,一般获取的数据都会是Json格式,所以自然而然我们要处理下Json,网络上有很多Json解析库,这里我使用Gso ...
- gson解析天气json_几种常用JSON解析库性能比较
PS:公众号推文时间工作日早晨8点50分,周末下午3点30分,不见不散哈! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Jav ...
- Java学习总结(随笔)——利用JSON解析实现网络下载
利用JSON实现网络下载 1.下载json字符串: (1)将网址封装到URL中:URL url=new URL("网址"); (2)利用url打开HTTP: HttpURLConn ...
- 深入 Go 中各个高性能 JSON 解析库
深入 Go 中各个高性能 JSON 解析库 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算 ...
最新文章
- webApp移动开发之REM
- centos普通用户SSH免密登录
- python大神-Python代码怎么写,听听顶尖Python大神的建议
- 在《糖豆人》身上,我们看到了竞技游戏火爆的六大因素
- ABAP Pragma
- linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
- 《推荐系统笔记(十六)》tf-idf与基于内容的推荐(简单的酒店推荐)
- 【数据结构和算法笔记】KMP算法介绍
- vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
- SWMM源码编译LNK2001 无法解析的外部符号 _swmm_close@0
- 我在低处仰望,梦过尘世幻想。
- oracle 查询时间段内的天,ORACLE任意时间段内所有天数日期查询
- xilinx中pll的使用与仿真步骤
- 服务器端测试常用linux命令
- 算术分解定理取根号的注意点
- TCP、UDP的区别
- 隐藏IDEA的行首的黄色小灯泡
- linux 基础常用命令集
- 自清洁半导体异质结衬底
- Python数据特征分析_01(MOOC学习时长分析)