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下载+编译+使用相关推荐

  1. C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  2. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  3. C++的Json解析库:jsoncpp

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org/,本文不再对json做介绍,将重点介绍c++的 ...

  4. C++的Json解析库:jsoncpp和boost .

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org/,本文不再对json做介绍,将重点介绍c++的 ...

  5. C++ JSON解析之jsoncpp库的使用

    C++ JSON解析之jsoncpp库的使用 1.介绍 轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,层次结构简洁清晰,易于人阅读和编写,易于机器解析和生成. 2.语法规则 ...

  6. 一个Json解析库的设计和实现

    一个Json解析库的设计和实现 一个Json解析库的设计和实现 设计思路 实现方法 1. 预处理(去除注释) 2. 词法分析 3. 语法分析 4. 树型优化 5. Json树构建 6. 后端处理 整体 ...

  7. Android学习之Json解析库Gson

    接着上一篇Volley,在使用Volley加载好数据之后,我们肯定不能直接使用这个数据,一般获取的数据都会是Json格式,所以自然而然我们要处理下Json,网络上有很多Json解析库,这里我使用Gso ...

  8. gson解析天气json_几种常用JSON解析库性能比较

    PS:公众号推文时间工作日早晨8点50分,周末下午3点30分,不见不散哈! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Jav ...

  9. Java学习总结(随笔)——利用JSON解析实现网络下载

    利用JSON实现网络下载 1.下载json字符串: (1)将网址封装到URL中:URL url=new URL("网址"); (2)利用url打开HTTP: HttpURLConn ...

  10. 深入 Go 中各个高性能 JSON 解析库

    深入 Go 中各个高性能 JSON 解析库 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算 ...

最新文章

  1. webApp移动开发之REM
  2. centos普通用户SSH免密登录
  3. python大神-Python代码怎么写,听听顶尖Python大神的建议
  4. 在《糖豆人》身上,我们看到了竞技游戏火爆的六大因素
  5. ABAP Pragma
  6. linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
  7. 《推荐系统笔记(十六)》tf-idf与基于内容的推荐(简单的酒店推荐)
  8. 【数据结构和算法笔记】KMP算法介绍
  9. vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
  10. SWMM源码编译LNK2001 无法解析的外部符号 _swmm_close@0
  11. 我在低处仰望,梦过尘世幻想。
  12. oracle 查询时间段内的天,ORACLE任意时间段内所有天数日期查询
  13. xilinx中pll的使用与仿真步骤
  14. 服务器端测试常用linux命令
  15. 算术分解定理取根号的注意点
  16. TCP、UDP的区别
  17. 隐藏IDEA的行首的黄色小灯泡
  18. linux 基础常用命令集
  19. 自清洁半导体异质结衬底
  20. Python数据特征分析_01(MOOC学习时长分析)

热门文章

  1. MATLAB数字水印系统
  2. 儿童吹泡泡水简单配方_最好的吹泡泡水的制作方法
  3. 如何做好BI项目的规划与实施方案?
  4. 《Mybatis 手撸专栏》第10章:使用策略模式,调用参数处理器
  5. 小米路由2+安装+php,小米路由器作为二级路由,完美使用APP和文件共享
  6. OBS 录制没有声音怎么办?
  7. python 移动文件语句_python移动文件
  8. 初识内存控制器和SDRAM【一文了解】
  9. 神舟计算机主板bios,神舟HASEE笔记本电脑开机进入BIOS的方法与bios设置图解
  10. 去哪儿网机票搜索系统的高并发架构设计