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 并存储于rootreader.parse(JsonString, root);// 提取namestd::string name = root["name"].asString();// 提取ageint32_t age = root["age"].asInt();// 提取namestd::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.mzph.cn/news/752238.shtml

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

相关文章

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…

arp动态表缓存清除

一、arp表里清除表状态&#xff1a; 1&#xff0c;Delay&#xff1a;请求arp 2&#xff0c;Reachab&#xff1a;响应arp 3&#xff0c;Stale此状态下&#xff0c;待gc_stale_time超时后&#xff0c;准备gc_interval定期清理 二、限制条件 base_reachable_time&#xff1a;后变…

USB - USB Gadget on Linux

February, 2012. Embedded Linux Conference 2012. Agenda Introduction to USB USB Gadget API Existing Gadgets Design your own Gadget Demo Conclusio About the Author Software engineer at Adeneo Embedded Linux, Android Main activities: – BSP adaptation – Driv…

Android系统 关于ntp的修改(网络时间同步)

一&#xff0c;现象&#xff1a; 1. NTP介绍 NTP&#xff1a;网络时间协议&#xff0c;英文名称&#xff1a;Network Time Protocol&#xff08;NTP&#xff09;是用来使计算机时间同步化的一种协议&#xff0c;它可以使计算机对其服务器或时钟源&#xff08;如石英钟&#x…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

4500万英镑!英国深化发展量子计算背后“内有乾坤”

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;2200字丨15分钟阅读 近期&#xff0c;英国国家量子计算中心&#xff08;NQCC&#xff09;宣布量子计算实验台竞赛的结果&#xff0c;七家量子…

Python 编程中反斜杠 “\” 的作用:作为续行符和转义字符,处理文件路径和正则表达式时需特别注意。

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Python 中的反斜杠 \ 可以被用作续行符&#xff0c;它允许你将一行代码分成多行来书写&#xff0c;以提高代码的可读性。这在处理长字符串、复杂的数学表达式或其他需要多行布局的代码时非常有用。 使…

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…

【PyTorch】基础学习:一文详细介绍 load_state_dict() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 load_state_dict() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#…

【算法与数据结构】堆排序TOP-K问题

文章目录 &#x1f4dd;堆排序&#x1f320; TOP-K问题&#x1f320;造数据&#x1f309;topk找最大 &#x1f6a9;总结 &#x1f4dd;堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆利…

R语言深度学习-6-模型优化与调试

本教程参考《RDeepLearningEssential》 这是本专栏的最后一篇文章&#xff0c;一路走来&#xff0c;大家应该都可以独立的建立一个自己的神经网络进行特征学习和预测了吧&#xff01; 6.1 缺失值处理 在我们使用大量数据进行建模的时候&#xff0c;缺失值对模型表现的影响非常…

定位及解决OOM

一、定义 内存溢出&#xff1a;OutOfMemoryError&#xff0c;是指因内存不够&#xff0c;导致操作新对象没有剩余空间。会导致频繁fullgc出现STW从而导致性能下降。 内存泄漏&#xff1a;指用malloc或new申请了一块内存&#xff0c;但是没有通过free或delete将内存释放&#…

30.HarmonyOS App(JAVA)鸿蒙系统app多线程任务分发器

HarmonyOS App(JAVA)多线程任务分发器 打印时间&#xff0c;记录到编辑框textfield信息显示 同步分发&#xff0c;异步分发&#xff0c;异步延迟分发&#xff0c;分组任务分发&#xff0c;屏蔽任务分发&#xff0c;多次任务分发 参考代码注释 场景介绍 如果应用的业务逻辑比…

LLM之Alpaca:深入了解大模型Alpaca

博客首发地址&#xff1a;LLM之Alpaca&#xff1a;深入了解大模型Alpaca - 知乎 官方链接&#xff1a;https://crfm.stanford.edu/2023/03/13/alpaca.html官方Git&#xff1a;tatsu-lab/stanford_alpaca官方模型&#xff1a;https://huggingface.co/tatsu-lab/alpaca-7b-wdiff…

Android Studio 打包 Maker MV apk 详细步骤

一.使用RPG Make MV 部署项目&#xff0c;获取项目文件夹 这步基本都不会有问题&#xff1a; 二.安装Android Studio 安装过程参考教材就行了&#xff1a; https://blog.csdn.net/m0_62491877/article/details/126832118 但是有的版本面板没有Android的选项&#xff08;勾…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

LM2903BIDR比较器芯片中文资料规格书PDF数据手册参数引脚图功能封装尺寸图

产品概述&#xff1a; M393B 和 LM2903B 器件是业界通用 LM393 和 LM2903 比较器系列的下一代版本。下一代 B 版本比较器具有更低的失调电压、更高的电源电压能力、更低的电源电流、更低的输入偏置电流和更低的传播延迟&#xff0c;并通过专用 ESD 钳位提高了 2kV ESD 性能和输…

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

UnityShader(十六)凹凸映射

前言&#xff1a; 纹理的一种常见应用就是凹凸映射&#xff08;bump mapping&#xff09;。凹凸映射目的就是用一张纹理图来修改模型表面的法线&#xff0c;让模型看起来更加细节&#xff0c;这种方法不会改变模型原本的顶点位置&#xff08;也就是不会修改模型的形状&#xf…