JSON 的了解和使用

news2024/10/7 4:27:25

目录

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 来完成序列化和反序列化的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】基本概念

基本概念 IP 地址端口号协议协议分层封装分用客户端服务器请求和响应两台主机之间的网络通信流程 IP 地址 概念&#xff1a;IP 地址主要是用于唯一标识网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单来说&#xff0c;IP地址用来唯一定位主机。格式&…

【GPT-SOVITS-02】GPT模块解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

【开源鸿蒙】模拟运行OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、准备工作1.1 编译输出目录简介 二、QEMU安装2.1 安装依赖2.2 获取源码2.3 编译安装2.4 问题解决 三、用QEMU运行OpenHarmony轻量系统3.1 qemu-run脚本简介3.2 qemu-run脚本参数3.3 qemu-run运行效果3.4 退出QEMU交互模式 四、问题解决五、参考链接 开源鸿蒙坚果派…

AntV L7深圳智慧城市

本案例使用L7库和Mapbox GL JS构建深圳智慧城市。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 获取数据6. 创建面图层7. 演示效果8. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <script src"https://unpkg.com/antv/l7"><…

Ubuntu 22.04 Nvidia Audio2Face Error:Failed to build TensorRT engine

背景 1.在Ubuntu22.04上安装Audio2Face后启动&#xff0c;嘴形不会实时同步。控制台显示如【图一】&#xff1a; 【图一】 2.log日志如下: Error: Error during running command: [‘/home/admin/omniverse/libs/deps/321b626abba810c3f8d1dd4d247d2967/exts/omni.audio2fac…

uniapp修改头像,选择图片

一、页面效果 二、手机上的效果 使用过的实例&#xff1a; 手机上就会显示类似如下&#xff1a; 三、代码 <view class"cleaner-top" click"chooseImg"><view class"cleaner-avatar"><image :src"imgArr" mode"…

K8S POD 启动探针 startupProbe 的使用

当我们启动一个POD 时&#xff0c; 当k8s detect 里面的容器启动成功时&#xff0c; 就会认为这个POD 启动完成了&#xff0c; 通常就会在状态里表示 ready 1/1 … 例如 rootk8s-master:~# kubectl get pods NAME READY STATUS RESTARTS AGE bq-api-demo 1…

基于STM32G4的0.96寸OLED显示屏驱动程序(HAL库),支持硬件/软件I2C

基于STM32G474的0.96寸OLED(SSD1306)显示屏驱动程序&#xff08;4针脚I2C接口&#xff09;&#xff0c;支持硬件IIC/软件IIC&#xff0c;HAL库版。 这款驱动程序比较完善&#xff0c;可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示&#xff0c;可…

Vue 3响应式系统详解:ref、toRefs、reactive及更多

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

195基于matlab的凸轮机构GUI界面

基于matlab的凸轮机构GUI界面 &#xff0c; 凸轮设计与仿真 绘制不同的凸轮轮廓曲线 &#xff0c;凸轮机构运动参数包括推程运动角&#xff0c;回程运动角&#xff0c;远休止角&#xff0c;近休止角。运动方式&#xff0c;运动规律。运动仿真过程可视化。内容齐全详尽。用GUI打…

ARM Cortex R52内核 01 概述

ARM Cortex R52内核 01 Introduction 1.1 Cortex-R52介绍 Cortex-R52处理器是一种中等性能、有序、超标量处理器&#xff0c;主要用于汽车和工业应用。它还适用于各种其他嵌入式应用&#xff0c;如通信和存储设备。 Cortex-R52处理器具有一到四个核心&#xff0c;每个核心实…

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 &#xff08;1&#xff09;布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 &#xff08;1&#xff09;redis高可用 &#xff08;2&#xff09;限流降级 &#xff08;3&#xff09;数据预热 一、缓存穿透 1、概念 缓…

java----网络编程(一)

一.什么是网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所…

sqlite 常见命令 表结构

在 SQLite 中&#xff0c;将表结构保存为 SQL 具有一定的便捷性和重要性&#xff0c;原因如下 便捷性&#xff1a; 备份和恢复&#xff1a;将表结构保存为 SQL 可以方便地进行备份。如果需要还原或迁移数据库&#xff0c;只需执行保存的 SQL 脚本&#xff0c;就可以重新创建表…

lv17 安防监控项目实战 3

代码目录 框架 our_storage 编译最终生成的目标文件obj 编译生成中间的.o文件 data_global.c 公共资源定义&#xff08;使用在外extern即可&#xff09;定义了锁定义了条件变量消息队列id、共享内存id、信号量id及key值发送短信、接收短信的号码向消息队列发送消息的函数&am…

Docker 哲学 - 容器操作 -cp

1、拷贝 容器绑定的 volume的 数据&#xff0c;到指定目录 2、匿名挂载 volume 只定义一个数据咋在容器内的path&#xff0c;docker自动生成一个 sha256 的key作为 volume 名字。这个 sha256 跟 commitID 一致都是唯一的所以 &#xff0c;docker利用这个机制&#xff0c;可以…

Python二级备考(1)考纲+基础操作

考试大纲如下&#xff1a; 基本要求 考试内容 考试方式 比较希望能直接刷题&#xff0c;因为不懂的比较多可能会看视频。 基础操作刷题&#xff1a; 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…

【C语言】指针基础知识(一)

计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中。 一,内存和地址 内存被分为一个个单元&#xff0c;一个内存单元的大小是一个字节。 内存单元的编号&#xff08;可以理解为门…

【回溯专题】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【未完待续】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

vulhub中GitLab 远程命令执行漏洞复现(CVE-2021-22205)

GitLab是一款Ruby开发的Git项目管理平台。在11.9以后的GitLab中&#xff0c;因为使用了图片处理工具ExifTool而受到漏洞CVE-2021-22204的影响&#xff0c;攻击者可以通过一个未授权的接口上传一张恶意构造的图片&#xff0c;进而在GitLab服务器上执行任意命令。 环境启动后&am…