JSON与Jsoncpp库:数据交换的灵活选择
目录
引言
一.JSON简介
二. Jsoncpp库概述
三. Jsoncpp核心类介绍
3.1 Json::Value类
3.2 序列化与反序列化类
四. 实现序列化
五. 实现反序列化
结语
引言
在现代软件开发中,数据交换格式扮演着至关重要的角色。JSON(JavaScript Object Notation)以其简洁、易于阅读和支持多种数据类型的特点,成为了数据交换领域的明星。本文将深入探讨JSON的基本概念、数据类型以及如何使用Jsoncpp库实现JSON的序列化与反序列化。
一.JSON简介
JSON是一种轻量级的数据交换格式,它基于文本,易于人阅读和编写,同时也易于机器解析和生成。JSON的数据结构包括以下几种:
- 对象:由花括号
{}
包围,存储键值对。- 数组:由中括号
[]
包围,存储有序集合。- 字符串:由双引号
""
包围。- 数字:整数或浮点数。
- 布尔值:
true
或false
。- null:表示空值。
例:⼩明同学的学⽣信息
char name = "⼩明";
int age = 18;
float score[3] = {88.5, 99, 58};
则json这种数据交换格式是将这多种数据对象组织成为⼀个字符串:
[{"姓名" : "⼩明","年龄" : 18,"成绩" : [88.5, 99, 58]},{"姓名" : "⼩⿊","年龄" : 18,"成绩" : [88.5, 99, 58]}
]
二. Jsoncpp库概述
Jsoncpp是一个流行的C++库,用于处理JSON数据。它提供了序列化和反序列化的机制,使得在C++程序中生成和解析JSON数据变得简单。
三. Jsoncpp核心类介绍
// Json数据对象类
class Json::Value
{Value &operator=(const Value &other); // Value重载了[]和=,因此所有的赋值和获取数据都可以通过Value &operator[](const std::string &key); // 简单的⽅式完成 val["姓名"] = "⼩明 ";Value &operator[](const char *key);Value removeMember(const char *key); // 移除元素const Value &operator[](ArrayIndex index) const; // val["成绩"][0]Value &append(const Value &value); // 添加数组元素val["绩"].append(88);ArrayIndex size() const; // 获取数组元素个数 val["绩"].size();std::string asString() const; // 转string string name =val["name"].asString();const char *asCString() const; // 转char* char *name =val["name"].asCString();Int asInt() const; // 转int int age = val["age"].asInt();float asFloat() const; // 转floatbool asBool() const; // 转 bool
};
// json序列化类,低版本⽤这个更简单
class JSON_API Writer
{virtual std::string write(const Value &root) = 0;
}
class JSON_API FastWriter : public Writer
{virtual std::string write(const Value &root);
}
class JSON_API StyledWriter : public Writer
{virtual std::string write(const Value &root);
}
// json序列化类,⾼版本推荐,如果⽤低版本的接⼝可能会有警告
class JSON_API StreamWriter
{virtual int write(Value const &root, std::ostream *sout) = 0;
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory
{virtual StreamWriter *newStreamWriter() const;
}
// json反序列化类,低版本⽤起来更简单
class JSON_API Reader
{bool parse(const std::string &document, Value &root, bool collectComments = true);
}
// json反序列化类,⾼版本更推荐
class JSON_API CharReader
{virtual bool parse(char const *beginDoc, char const *endDoc,Value *root, std::string *errs) = 0;
}
class JSON_API CharReaderBuilder : public CharReader::Factory
{virtual CharReader *newCharReader() const;
}
3.1 Json::Value类
Json::Value
类是Jsoncpp中表示JSON数据的核心类。它提供了一系列的方法来操作JSON数据:
operator[]
:通过键名或数组索引访问数据。asString
、asInt
、asFloat
、asBool
:将JSON数据转换为相应的C++数据类型。append
:向JSON数组中添加元素。
3.2 序列化与反序列化类
序列化是将JSON对象转换为字符串的过程,反序列化则是相反的过程。Jsoncpp提供了以下类来实现这些功能:
StreamWriter
和StreamWriterBuilder
:用于创建序列化器,将Json::Value
对象转换为JSON格式的字符串。CharReader
和CharReaderBuilder
:用于创建反序列化器,将JSON格式的字符串解析为Json::Value
对象。
四. 实现序列化
下面是一个使用Jsoncpp实现序列化的示例:
#include <jsoncpp/json/json.h>
#include <iostream>
#include <sstream>
#include <memory>int main() {const char* name = "小明";int age = 19;float score[] = {77.5, 88, 99.5};Json::Value val;val["姓名"] = name;val["年龄"] = age;val["成绩"] = Json::Value(Json::arrayValue);for (float s : score) {val["成绩"].append(s);}Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;// 检查sw是否为空指针if (!sw) {std::cerr << "Failed to create StreamWriter" << std::endl;return -1;}try {int result = sw->write(val, &ss);if (result != 0) { // 检查是否有错误std::cerr << "Write failed with error code: " << result << std::endl;} else {std::cout << ss.str() << std::endl;}} catch (const std::exception& e) {std::cerr << "Exception occurred: " << e.what() << std::endl;return -1;}return 0;
}
五. 实现反序列化
下面是一个使用Jsoncpp实现反序列化的示例:
#include <jsoncpp/json/json.h>
#include <iostream>
#include <string>int main()
{std::string str = R"({"姓名":"小明", "年龄":18, "成绩":[76.5, 55, 88]})";Json::Value root;Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;if (!cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err)){std::cout << "Parse error: " << err << std::endl;}else{std::cout << "Name: " << root["姓名"].asString() << std::endl;std::cout << "Age: " << root["年龄"].asInt() << std::endl;int sz = root["成绩"].size();for (int i = 0; i < sz; i++){std::cout << "Score: " << root["成绩"][i].asFloat() << std::endl;}}return 0;
}
结语
JSON作为一种灵活的数据交换格式,结合Jsoncpp库,为C++开发者提供了强大的数据交换能力。无论是网络通信还是数据存储,JSON和Jsoncpp都是你的理想选择。通过本文的介绍,希望你能对JSON和Jsoncpp有一个全面的了解,并能将其应用到实际开发中。
相关文章:

JSON与Jsoncpp库:数据交换的灵活选择
目录 引言 一.JSON简介 二. Jsoncpp库概述 三. Jsoncpp核心类介绍 3.1 Json::Value类 3.2 序列化与反序列化类 四. 实现序列化 五. 实现反序列化 结语 引言 在现代软件开发中,数据交换格式扮演着至关重要的角色。JSON(JavaScript Object Notati…...
salesforce rich text 字段支持html中内嵌JavaScript吗
Salesforce 的富文本字段(Rich Text Field)不支持在 HTML 中内嵌 JavaScript。为了安全,Salesforce 会自动移除或过滤用户输入中的任何 JavaScript 代码。这是为了防止跨站点脚本(XSS)攻击,从而保护 Salesf…...

Ubuntu24.04、22.04或20.04安装Golang方法教程
在Ubuntu Linux(例如 Ubuntu 24.04、22.04 或 20.04)上安装Go(Golang)是一个简单的过程。我们可以使用默认系统存储库使用本教程中给出的命令下载开源 Go 编程语言,轻松构建简单、可靠和高效的软件。 Go语言由Google…...
学习记录第二十二天
time函数与localtime函数 在Linux环境下使用C语言处理时间,通常会涉及到几个重要的头文件和函数。主要的头文件是 <time.h>,它包含了处理时间的各种函数和数据结构。 1. 数据结构 1.time_t: 一个类型定义,用于存储时间值,…...

红酒与艺术展览:品味艺术与风味的双重盛宴
当艺术的魅力与红酒的醇香交织在一起,一场别开生面的盛宴便悄然展开。今天,让我们一同走进这场红酒与艺术展览的邂逅,品味艺术与风味的双重盛宴。 一、艺术展览的瑰丽世界 艺术展览,如同一座瑰丽的宝库,汇聚了无数艺…...

1Panel配置
1. 脚本安装 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh2. 配置镜像加速 在容器-> 配置中设置,否则安装软件会失败。 https://docker.211678.top https://docker.1panel.live …...
场外期权是如何定价的?场外期权定价的基本原理是什么?
场外期权的定价通常基于多种复杂的因素,以下是一些场外期权主要的影响因素和常见的定价方法: 影响场外期权定价的因素: 标的资产价格:标的资产当前的市场价格是定价的基础。标的资产价格波动率:波动率反映了标的资产价…...
vue中数据持久化
在Vue中,数据持久化通常指的是将Vue组件或应用中的数据保存到用户的浏览器或设备的存储中,以便在用户的会话(session)或跨会话(如重新加载页面或重新打开浏览器)中保持这些数据。Vue本身并不直接提供数据持…...

小白零基础学数学建模系列-Day3-线性回归模型的构建与评估
文章目录 1 线性回归基础1.1 线性回归概念与应用1.2 数学原理与推导1.3 线性回归的实现 2 案例分析:房价预测2.1 加载数据2.2 数据预处理2.3 探索性数据分析2.4 观察选择特征2.5 准备训练模型的数据2.6 将数据拆分为训练集和测试集2.7 训练和测试模型2.8 模型评估 3…...
Flutter中的 extended_nested_scroll_view 库:介绍与使用指南
在开发Flutter应用时,处理复杂的滚动效果是一项常见的任务。Flutter提供了NestedScrollView来实现可折叠的应用栏与滚动列表的结合,但在某些情况下,NestedScrollView可能不够强大。为了解决这些问题,我们可以使用extended_nested_…...
Elasticsearch 综合搜索案例解析
Elasticsearch 是一个功能强大的搜索引擎,它不仅支持全文搜索,还提供了排序、分页、高亮显示等多种搜索结果处理功能。通过综合使用这些功能,我们可以构建出丰富而高效的搜索应用。本文将通过一个具体的案例,介绍如何在 Elasticse…...
Web存储革命:揭秘JavaScript的会话存储(sessionStorage)
标题:Web存储革命:揭秘JavaScript的会话存储(sessionStorage) 在当今的Web开发中,状态管理和数据持久化是构建交互式应用的关键。JavaScript提供了多种客户端存储解决方案,其中会话存储(sessio…...

基于python的百度迁徙迁入、迁出数据分析(九)
副标题:从百度迁徙数据看——人口虹吸效应 人口虹吸效应:人口虹吸效应是指大城市或中心城市因其经济、文化、教育、医疗等资源的优势,吸引周边地区的人口、资本和其他资源向其集中的一种现象。这种效应在城市化进程中尤其明显,通…...

2025上海礼品展 华东礼品工艺品展览会
2025第25届上海国际礼品及家居用品展 在璀璨繁华的上海,一场盛大的礼品盛宴即将拉开帷幕。2025年上海国际礼品及 家居用品展览会(简称“华礼展”),作为华东地区乃至全国范围内备受瞩目的礼 品行业盛会,将于2025年6月29日至7月1日在上海新国…...
Flink开发(一):概述与基础
目录 1. Flink概述 1.1 什么是Flink? 1.2 Flink的主要特点 2. Flink的核心组件 2.1 Flink架构 2.2 数据流模型 3. Flink的基础应用 3.1 开发环境配置 3.3 数据源和数据接收器 4. Flink的高级功能 4.1 状态管理与容错 4.2 窗口操作 5. Flink的应用场景 …...

GD32E503实现串口中断收发功能
如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…...

照片怎么提取文字?分享5种简单好用的提取方法
在我们日常的学习或者是办公中,往往会使用到大量的图片文件,而在这些图片中往往蕴含着丰富的文字信息,但手动输入不仅费时费力,还容易出错。如果能够一键提取出图片中的文字就会大大提高工作效率,下面给大家分享5种提取…...
最佳云服务器推荐:三丰云免费虚拟主机和云服务器
随着云计算技术的不断发展,越来越多的企业和个人开始将业务迁移到云端。在这个过程中,选择一款稳定、高效、性价比高的云服务器至关重要。今天,我就为大家推荐一家备受好评的云服务器提供商——三丰云(https://www.sanfengyun.com…...
IPKISS Tutorial 目录(目前 45 篇 持续更新中,部分教程尚未制作成目录)
IPKISS Tutorial 目录 芯片版图绘制教程IPKISS Tutorial(5)Basis直接创建结构(1)PCell(3)Layer and Template(Trace Template)(2)参数查询(2)Lumerical API&a…...

加强混合工作时代的组织网络安全态势
随着组织转向采用和实施混合和远程工作模式,网络安全的重要性从未如此重要。虽然工作场所的这种演变提供了灵活性并有望提高生产力,但它也带来了组织无法忽视的无数网络安全挑战。多样化工作环境的整合需要强大的安全措施、创新的保护策略和警惕的文化&a…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...