JSON 的了解和使用

目录

1. JSON

2. JSONcpp 的安装

3. JSONcpp 相关API的使用

3.1. 将 Json::Value 对象转化为 std::string  

3.1.1. Json::Value 类

3.1.2. Json::Value::toStyledString 接口 

3.1.3. Json::StyledWriter 类

3.1.4. Json::StyledWriter::write 接口

3.1.5. Json::FastWriter 类

3.2. 将 std::string 转化为 Json::Value 对象

3.2.1. Json::Reader 类

3.2.2. Json::Reader::parse 接口


1. JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的子集,但是独立于编程语言,因此可以被多种编程语言支持和解析。JSON以易于人类阅读和编写的方式来表示数据,通常用于在网络之间传输数据。

JSON数据是以键值对的形式组织的,键值对之间用逗号分隔,键和值之间用冒号分隔,整个数据被包裹在大括号 {} 中。例如:

// 形式一:
{
    "name" : "Xu Qian",
    "age" : 22,
    "city" : "Xi'an"
}

// 形式二:
{ "name" : "Xu Qian", "age" : 22, "city" : "Xi'an" }

2. JSONcpp 的安装

因为我们需要在 C++ 中解析和生成JSON数据, 因此我们需要安装 jsoncpp库, 用于处理JSON数据, 它提供了一组简单的API,可以方便地解析JSON字符串、生成JSON字符串以及在C++对象和JSON之间进行转换。

// 安装 jsoncpp 库
sudo yum install -y jsoncpp-devel

安装成功后,我们可以查看一下相关的库以及头文件。

jsoncpp 相关的库文件:

jsoncpp 相关的头文件: 

3. JSONcpp 相关API的使用

3.1. 将 Json::Value 对象转化为 std::string  

这个过程不就是一个序列化过程吗? 答案:是的。

3.1.1. Json::Value 类

Json::Value 是 JSONcpp 库中的一个类,用于表示 JSON 数据的任意类型

在 JSONcpp 中,Json::Value 类是一个非常灵活的数据结构,可以表示 JSON 中的任何类型数据,包括对象、数组、字符串、数字、布尔值和空值。

例如:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

int main()
{
  // 创建一个 Json::Value 对象
  Json::Value root;

  // 向 Json 对象添加键值对
  root["name"] = "Xu Qian";
  root["age"] = "22";
  root["city"] = "Xi'an";

  // 将 Json 对象转换为字符串并输出
  std::string JsonString = root.toStyledString();
  std::cout << "Json String: " << JsonString << std::endl;

  return 0;
}

运行现象:

3.1.2. Json::Value::toStyledString 接口 

函数原型:

std::string toStyledString() const;

在 Jsoncpp 中,toStyledString 是一个用于将 JSON 值格式化为带缩进和换行符的字符串的方法。

toStyledString 方法是 Json::Value 类的成员方法,Json::Value 实例化后的对象调用 toStyledString,会返回一个格式化后的字符串表示该 JSON 值。

格式化后的字符串包含了缩进和换行符,以便更容易阅读和理解。 就例如上面的运行现象一样。

3.1.3. Json::StyledWriter 类

Json::StyledWriter 是 JSONcpp 库中的一个类,用于将 Json::Value 对象中的 JSON 数据以美化的方式格式化为字符串输出

在处理 JSON 数据时,通常我们希望输出的 JSON 字符串具有良好的可读性,以便于调试和理解。

而 Json::StyledWriter 类就提供了这样的功能,它会在输出的 JSON 字符串中添加缩进和换行,使得其结构更加清晰,易于阅读。

下面用实例用以说明:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>


int main()
{
  // 创建一个 Json::Value 对象
  Json::Value root;

  // 向 Json 对象添加键值对
  root["name"] = "Xu Qian";
  root["age"] = "22";
  root["city"] = "Xi'an";

  // 创建一个 Json::StyledWriter 对象
  Json::StyledWriter writer;
  // 通过该对象的write接口将 JSON 对象转换为美化的字符串并输出
  std::string jsonString = writer.write(root);
  std::cout << "Styled JSON String: " << jsonString << std::endl;

  return 0;
}

现象如下: 

3.1.4. Json::StyledWriter::write 接口

Json::StyledWriter::write 是 JSONcpp 库中 Json::StyledWriter 类的成员函数用于将 Json::Value 对象中的 JSON 数据以美化的方式格式化为字符串输出。

函数原型:

std::string write(const Value &root) const;
  • 参数 root 是一个 Json::Value 对象,它包含了需要被转换为 JSON 字符串的数据。该函数返回一个 std::string 类型的字符串,其中包含了以美化格式表示的 JSON 数据。
  • 使用 Json::StyledWriter::write 函数,你可以将 Json::Value 对象中的 JSON 数据转换为易于阅读的字符串,以便于输出、保存或传输。这在调试和输出 JSON 数据时特别有用,因为美化的 JSON 字符串更容易被人类读取和理解。

3.1.5. Json::FastWriter 类

Json::FastWriter 是 JSONcpp 库中的一个类,用于将 Json::Value 对象中的 JSON 数据以一种更紧凑的方式格式化为字符串输出。

与 Json::StyledWriter 不同,Json::FastWriter 输出的 JSON 字符串不包含额外的空格、缩进或换行,因此更加紧凑,适合在需要减少字符串大小或传输速度较重要的情况下使用。

FastWriter 也有write接口,函数原型如下:

std::string write(const Value &root) const;

与 Json::StyledWriter::write 唯一不同的就是, 返回的字符串的格式不同罢了

下面用实例说明:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

int main()
{
  // 创建一个 Json::Value 对象
  Json::Value root;

  // 向 Json 对象添加键值对
  root["name"] = "Xu Qian";
  root["age"] = "22";
  root["city"] = "Xi'an";
  
  // 创建一个 Json::Value 对象
  Json::Value score;
  score["math"] = "85";
  score["english"] = "76";

  // 将score内嵌到root中
  root["score"] = score;

  // 创建一个 Json::FastWriter 对象
  Json::FastWriter writer;
  std::string jsonString = writer.write(root);
  std::cout << "Styled JSON String: " << jsonString << std::endl;

  return 0;
}

现象如下:

3.2. 将 std::string 转化为 Json::Value 对象

这个过程不就是一个反序列化的过程吗? 答案是的。

3.2.1. Json::Reader 类

  • Json::Reader 是 Jsoncpp 库中的一个类,用于解析 JSON 字符串并将其转换为 Json::Value 对象。
  • Json::Reader 类的主要作用是读取 JSON 字符串并将其解析为 Json::Value 对象。
  • 它提供了一个 parse() 方法,可以接受一个 JSON 字符串作为参数,并尝试将其解析为一个 Json::Value 对象。
  • 如果解析成功,parse() 方法将返回 true,并将解析后的 JSON 数据存储在提供的 Json::Value 对象中;
  • 如果解析失败,parse() 方法将返回 false,并且可以通过调用 getFormattedErrorMessages() 方法获取解析错误的详细信息。

3.2.2. Json::Reader::parse 接口

Json::Reader::parse 是一个函数接口,用于将 JSON 字符串解析为 C++ 中的数据结构。它通常用于处理 JSON 数据的读取和解析操作。以下是该接口的函数原型:

bool Json::Reader::parse(const std::string& document, \
            Json::Value& root, bool collectComments = true)

函数参数说明:

  • document:要解析的 JSON 字符串。
  • root:用于存储解析后的 JSON 数据的 Json::Value 对象。
  • collectComments:一个布尔值,指示是否收集并保存 JSON 中的注释,默认为 true。如果为 true,则在解析过程中会保留 JSON 中的注释信息;如果为 false,则会忽略注释。

函数返回值:

  • 如果解析成功,则返回 true;
  • 如果解析失败,则返回 false。

接下来,我们以实例说明:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

int main()
{
  // 这里的 \ 是一个转义字符, 让\" 用来表示 " 自身
  std::string JsonString = "{\"name\" : \"Xu Qian\", \"age\" : 22, \"city\" : \"Xi'an\"}";

  // 我们就需要通过 Jsoncpp 的相关API将
  // 上面的JsonString 反序列化为特定数据
  
  // 该对象用来存储解析后的JSON数据
  Json::Value root;

  // 定义一个 Json::Reader 对象
  
  Json::Reader reader;
  
  // 解析JsonString 并存储于root
  reader.parse(JsonString, root);
  
  // 提取name
  std::string name = root["name"].asString();
  // 提取age
  int32_t age = root["age"].asInt();
  // 提取name
  std::string city = root["city"].asString();

  std::cout << "name: " << name << std::endl;
  std::cout << "age: " << age << std::endl;
  std::cout << "city: " << city << std::endl;

  return 0;
}

现象如下: 

总而言之, 未来我们就可以用 Jsoncpp 来完成序列化和反序列化的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466325.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git remote Support for password authentication was removed on August 13, 2021

一 问题描述 git push 上报时提示 remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 原因是&#xff1a;github 从2021年8月13日开始就不能用了&#xff0c;必须使用个人访问令牌&#xff08;pers…

Midjourney绘图欣赏系列(十三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

Clickhouse 单机部署安装

前言 在大数据的时代背景下&#xff0c;数据的处理和分析能力成为企业竞争力的关键。ClickHouse&#xff0c;作为一款由俄国Yandex公司开发的分布式数据分析型数据库&#xff0c;凭借其卓越的性能和稳定性&#xff0c;赢得了业界的广泛关注。本文将介绍ClickHouse的基本概念、…

java IO 04 对象处理流,序列化

01.序列化和反序列化的作用 重点&#xff1a; 图&#xff1a; 02.对象流ObjectOutputStream和ObjectInputStream ObjectInputStream&#xff1a; ObjectOutputStream&#xff1a; 例子&#xff1a; 例子&#xff1a; 修改要序列化类的话&#xff0c;会出现不同的uid…

为什么要为 App 应用加固 ?如何为 App 应用加固 ?

一&#xff1a;为什么要为 App 应用加固 来看下 腾讯开放平台 官方的解释说明 若应用不做任何安全防护&#xff0c;极易被病毒植入、广告替换、支付渠道篡改、钓鱼、信息劫持等&#xff0c;严重侵害开发者的利益。 App 加固后&#xff0c;可以对应用进行安全防护&#xff0c;防…

酷开科技以酷开系统的力量让电视机“活”起来

让用户回归电视的绝不会是因为电视机本身&#xff0c;而是电视系统的内容和交互的形式。酷开科技以系统的力量让电视机“活”起来。对于许多人来说&#xff0c;观看电影是一种享受、一种放松、一种逃避现实的方式。而现在&#xff0c;酷开科技作为行业内领军企业&#xff0c;为…

Echarts横向柱形图

项目原型图如下: 实际上就是设置两个y轴&#xff0c;第一个显示底色柱子&#xff0c;另一个只显示真实数据的柱子,在这里只显示y轴,x轴不显示.. this.middleLeftOption {tooltip: {trigger: axis,axisPointer: {}},legend: {data: [回退次数],y: bottom},grid: {left: 3%,righ…

你清楚微信加好友的规则吗?

微信加人的规则是&#xff1a; 1、通过附近人功能加人上限15人/天&#xff0c;频率3次/天&#xff0c;间隔时间1-2小时&#xff1b; 2、通过摇一摇功能加人上限15人/天&#xff0c;频率3次/天&#xff0c;间隔时间1-2小时&#xff1b; 3、通过通讯录搜索功能加人上限6人/单次…

【大模型】直接在VS Code(Visual Studio Code)上安装CodeGeeX插件的过程

文章目录 一、什么是CodeGeeX&#xff08;一&#xff09;我理解的CodeGeeX&#xff08;二&#xff09;优缺点 二、CodeGeex下载、安装、注册&#xff08;一&#xff09;安装VS Code(Visual Studio Code)&#xff08;二&#xff09;下载安装CodeGeeX&#xff08;三&#xff09;注…

泰迪智能科技携手华北电力大学理学院共建“校外实践基地”

3月15日&#xff0c;华北电力大学数理学院教学副主任史会峰、科研副主任王涛、概率教研室副主任解西阳莅临泰迪智能科技产教融合实训基地开展“华北电力大学校外实践教学基地”签约揭牌仪式。泰迪智能科技董事长张良均、支持中心负责人王宏刚、外联部吴桂锋进行接待。 活动伊始…

动手学深度学习9 多层感知机+代码实现

多层感知机代码实现 1. 感知机2. 多层感知机单隐藏层三个激活函数多隐藏层 3. 代码实现从零开始实现简洁实现注意 4. QA 1. 感知机 视频&#xff1a;https://www.bilibili.com/video/BV1hh411U7gn/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 书&am…

如何修改Notes Domino中的默认通讯端口

大家好&#xff0c;才是真的好。 不知道有多少人知道&#xff0c;Notes客户机和Domino服务器之间默认的通讯协议叫做NRPC&#xff0c;很多人就直接称之为Notes协议&#xff0c;Notes和Domino服务器之间的数据通信&#xff0c;都是采用安全的NRPC协议&#xff0c;采用的端口默认…

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

echarts实践总结(常用一):柱状图(特点:渐变色、点击缩放、左右滑动、悬浮展示样式)

目录 第一章 echarts基本使用 第二章 echarts实践——柱状图 效果展示 第一章 echarts基本使用 Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客 第二章 echarts实践——柱状图 最近接到这么一个需求&#xff0c;需要画页面&#xff0c;然后有这么几个echarts的图需…

25双体系Java学习之StringBuffer和StringBuilder

StringBuffer和StringBuilder ★小贴士 String str new String("welcome to "); str "here"; 字符串的拼接过程实际上是通过建立一个StringBuffer&#xff0c;然后调用StringBuffer的append方法&#xff0c;最后再将StringBuffer转为字符串&#xff0c…

【网络安全】0xhacked CTF 大赛题解出炉啦!

此次 0xhacked CTF 比赛&#xff0c;ChainSecLabs 取得了第四名的成绩。让我们来看看比赛题目的题解吧。&#xff08;题目代码仓库在文末哦~&#xff09; BabyOtter 这是应该说是一个算法题&#xff0c;很明显需要溢出&#xff0c;因为精度问题&#xff0c;uint256(-1)/0x1…

代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合(JS写法)

回溯理论基础 回溯法解决的问题都可以抽象为树形结构&#xff0c;因为回溯法解决的都是在集合中递归查找子集&#xff0c;集合的大小就构成了树的宽度&#xff0c;递归的深度&#xff0c;都构成的树的深度。递归就要有终止条件&#xff0c;所以必然是一棵高度有限的树&#xff…

仰卧起坐计数,YOLOV8POSE

仰卧起坐计数&#xff0c;YOLOV8POSE 通过计算膝盖、腰部、肩部的夹角&#xff0c;计算仰卧起坐的次数

springboot278基于JavaWeb的鲜牛奶订购系统的设计与实现

鲜牛奶订购系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统鲜牛奶订购信息管理难度大&…

Python使用 k 均值对遥感图像进行语义分割

本篇文章介绍K-means语义分割来估计 2000 年至 2023 年咸海水面的变化 让我们先看一下本教程中将使用的数据。这是同一地区的两张 RGB 图像,间隔 23 年,但很明显地表特性和大气条件(云、气溶胶等)不同。这就是为什么我决定训练两个独立的 k-Means 模型,每个图像一个。 首…