【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录

1 -> Jsoncpp

1.1 -> 特性

1.2 -> 安装

2 -> 序列化

3 -> 反序列化

4 -> Json::Value


1 -> Jsoncpp

Jsoncpp是一个用于处理JSON数据的C++库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C++数据结构的功能。Jsoncpp是开源的,广泛用于各种需要处理JSON数据的C++项目中。

1.1 -> 特性

  1. 简单易用:Jsoncpp提供了直观的API,使得处理JSON数据变得简单。
  2. 高性能:Jsoncpp的性能经过优化,能够高效地处理大量JSON数据。
  3. 全面支持:支持JSON标准中的所有数据类型,包括对象、数组、字符串、数字、布尔值和 null。
  4. 错误处理:在解析JSON数据时,Jsoncpp提供了详细的错误信息和位置,方便开发者调试。

当使用Jsoncpp库进行JSON的序列化和反序列化时,确实存在不同的做法和工具类可供选择。以下是对Jsoncpp中序列化和反序列化操作的详细介绍。

1.2 -> 安装

ubuntu:sudo apt-get install libjsoncpp-dev
Centos: sudo yum install jsoncpp-devel

2 -> 序列化

序列化指的是将数据结构或对象转换为一种格式,以便在网络上传输或存储到文件中。Jsoncpp提供了多种方式进行序列化:

1. 使用Json::Value的toStyledString方法:

优点:将Json::Value对象直接转换为格式化的JSON字符串。

示例:

#define _CRT_SECURE_NO_WARNINGS 1

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

int main()
{
	Json::Value root;
	root["name"] = "joe";
	root["sex"] = "男";
	std::string s = root.toStyledString();
	std::cout << s << std::endl;
	return 0;
}

$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

2. 使用Json::StreamWriter:

优点:提供了更多的定制选项,如缩进、换行符等。

示例:

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

int main()
{
	Json::Value root;
	root["name"] = "joe";
	root["sex"] = "男";
	Json::StreamWriterBuilder wbuilder; // StreamWriter 的工厂

	std::unique_ptr<Json::StreamWriter>
	writer(wbuilder.newStreamWriter());

	std::stringstream ss;
	writer->write(root, &ss);

	std::cout << ss.str() << std::endl;

	return 0;
}
$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

3. 使用Json::FastWriter:

优点:比StyledWriter更快,因为它不添加额外的空格和换行符。

示例:

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

int main()
{
	Json::Value root;
	root["name"] = "joe";
	root["sex"] = "男";

	// Json::FastWriter writer;
	Json::StyledWriter writer;

	std::string s = writer.write(root);
	std::cout << s << std::endl;

	return 0;
}

$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

3 -> 反序列化

反序列化指的是将序列化后的数据重新转换为原来的数据结构或对象。Jsoncpp提供了以下方法进行反序列化:

1. 使用Json::Reader:

优点:提供详细的错误信息和位置,方便调试。

示例:

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

int main() 
{
	// JSON 字符串
	std::string json_string = "{\"name\":\"张三\",
		\"age\":30, \"city\":\"北京\"}";

	// 解析 JSON 字符串
	Json::Reader reader;
	Json::Value root;

	// 从字符串中读取 JSON 数据
	bool parsingSuccessful = reader.parse(json_string, root);
	if (!parsingSuccessful) {
		// 解析失败,输出错误信息
		std::cout << "Failed to parse JSON: " <<
			reader.getFormattedErrorMessages() << std::endl;

		return 1;
	}

	// 访问 JSON 数据
	std::string name = root["name"].asString();
	int age = root["age"].asInt();
	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;
}

$ . / test.exe
Name : 张三
Age : 30
City : 北京

2. 使用Json::CharReader 的派生类:

在某些情况下,你可能需要更精细地控制解析过程,可以直接使用Json::CharReader的派生类。

但通常情况下,使用Json::parseFromStream或Json::Reader的parse方法就足够了。

总结:

  • toStyledString、StreamWriter和FastWriter提供了不同的序列化选项,你可以根据具体需求选择使用。
  • Json::Reader和parseFromStream函数是Jsoncpp中主要的反序列化工具,它们提供了强大的错误处理机制。
  • 在进行序列化和反序列化时,请确保处理所有可能的错误情况,并验证输入和输出的有效性。

4 -> Json::Value

Json::Value是Jsoncpp库中的一个重要类,用于表示和操作JSON数据结构。以下是一些常用的Json::Value操作列表:

1. 构造函数

  • Json::Value():默认构造函数,创建一个空的Json::Value对象。
  • Json::Value(ValueType type,bool allocated = false):根据给定的ValueType(如nullValue,intValue,stringValue等)创建一个Json::Value对象。

2. 访问元素

  • Json::Value& operator[](const char* key):通过键(字符串)访问对象中的元素。如果键不存在,则创建一个新的元素。
  • Json::Value& operator[](const std::string& key):同上,但使用std::string类型的键。
  • Json::Value& operator[](ArrayIndex index):通过索引访问数组中的元素。如果索引超出范围,则创建一个新的元素。
  • Json::Value& at(const char* key):通过键访问对象中的元素,如果键不存在则抛出异常。
  • Json::Value& at(const std::string& key):同上,但使用std::string类型的键。

3. 类型检查

  • bool isNull():检查值是否为null。
  • bool isBool():检查值是否为布尔类型。
  • bool isInt():检查值是否为整数类型。
  • bool isInt64():检查值是否为64位整数类型。
  • bool isUInt():检查值是否为无符号整数类型。
  • bool isUInt64():检查值是否为64位无符号整数类型。
  • bool isIntegral():检查值是否为整数或可转换为整数的浮点数。
  • bool isDouble():检查值是否为双精度浮点数。
  • bool isNumeric():检查值是否为数字(整数或浮点数)。
  • bool isString():检查值是否为字符串。
  • bool isArray():检查值是否为数组。
  • bool isObject():检查值是否为对象(即键值对的集合)。

4. 赋值和类型转换

  • Json::Value& operator=(bool value):将布尔值赋给Json::Value对象。
  • Json::Value& operator=(int value):将整数赋给Json::Value对象。
  • Json::Value& operator=(unsigned int value):将无符号整数赋给Json::Value对象。
  • Json::Value& operator=(Int64 value):将64位整数赋给Json::Value对象。
  • Json::Value& operator=(UInt64 value):将64位无符号整数赋给Json::Value 对象。
  • Json::Value& operator=(double value):将双精度浮点数赋给Json::Value对象。
  • Json::Value& operator=(const char* value):将C字符串赋给Json::Value对象。
  • Json::Value& operator=(const std::string& value):将std::string赋给Json::Value对象。
  • bool asBool():将值转换为布尔类型(如果可能)。
  • int asInt():将值转换为整数类型(如果可能)。
  • Int64 asInt64():将值转换为64位整数类型(如果可能)。
  • unsigned int asUInt():将值转换为无符号整数类型(如果可能)。
  • UInt64 asUInt64():将值转换为64位无符号整数类型(如果可能)。
  • double asDouble():将值转换为双精度浮点数类型(如果可能)。
  • std::string asString():将值转换为字符串类型(如果可能)。

5. 数组和对象操作

  • size_t size():返回数组或对象中的元素数量。
  • bool empty():检查数组或对象是否为空。
  • void resize(ArrayIndex newSize):调整数组的大小。
  • void clear():删除数组或对象中的所有元素。
  • void append(const Json::Value& value):在数组末尾添加一个新元素。
  • Json::Value& operator[](const char* key, const Json::Value&defaultValue = Json::nullValue):在对象中插入或访问一个元素,如果键不存在则使用默认值。
  • Json::Value& operator[](const std::string& key, constJson::Value& defaultValue = Json::nullValue):同上,但使用std::string类型的。

感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

Ubuntu20.04安装ROS2教程

Ubuntu20.04安装ROS2教程 ROS 2 安装指南支持的ROS 2 版本设置语言环境&#xff08;Set locale&#xff09;设置源&#xff08;Setup Sources&#xff09;设置密钥安装 ROS 2 包&#xff08;Install ROS 2 packages&#xff09;环境设置&#xff08;Environment setup&#xff…

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

第三届OpenHarmony技术大会在上海成功举办

10月12日&#xff0c;以“技术引领筑生态&#xff0c;万物智联创未来”为主题的第三届OpenHarmony技术大会&#xff08;以下简称“大会”&#xff09;在上海成功举办。本次大会由OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;项目群技术指导委员会&…

【Mac苹果电脑安装】DBeaverEE for Mac 数据库管理工具软件教程【保姆级教程】

Mac分享吧 文章目录 DBeaverEE 数据库管理工具 软件安装完成&#xff0c;打开效果图片Mac电脑 DBeaverEE 数据库管理工具 软件安装——v24.21️⃣&#xff1a;下载软件2️⃣&#xff1a;安装JDK&#xff0c;根据下图操作步骤提示完成安装3️⃣&#xff1a;安装DBeaverEE&#…

如何进行数据库缩容 | OceanBase应用实践

作者&#xff1a;关炳文&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持。 本文详细介绍了OceanBase V3.2版的集群中&#xff0c;面对数据文件缩容的场景的一套缩容方案&#xff0c;作为大家的参考。 缩容场景 某银行运行的一套采用1-1-1架构的OceanBase…

软件架构师 PV

PV操作与生产者消费者问题是操作系统中进程管理和同步机制的重要概念。以下是对PV操作以及生产者消费者问题的详细解释&#xff1a; 一、PV操作 PV操作由P操作原语和V操作原语组成&#xff0c;这两个原语是不可中断的过程&#xff0c;它们对信号量进行操作。 P操作&#xff…

首发 | 数据通解决方案:打造数据工程能力,驱动数据价值转化

数据已经成为企业竞争的核心资源。企业要想从海量数据资源中挖掘数据价值并促进价值转换&#xff0c;需要有全新的工程化方法对数据要素资源进行全生命周期管理。 数据工程是一套完整的实现从数据资源到企业价值的系统工程&#xff0c;旨在通过系统性技术与方法&#xff0c;将…

2024.10.16 软考学习笔记

刷题网站&#xff1a; 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

vector简单模拟

1.二维vector 下图可以看到vector<int>指向的是几个int型的&#xff0c;而vector<vector<int>>则指向的是几个vector<int>型的内容&#xff0c;而它们又指向几个int型的内容&#xff0c;三维就重复就可以理解。 例题&#xff1a; 可以得到的规律中间(…

Java—继承性与多态性

目录 一、this关键字 1. 理解this 2. this练习 二、继承性 2.1 继承性的理解 2.1.1 多层继承 2.2 继承性的使用练习 2.2.1 练习1 2.2.2 练习2 2.3 方法的重写 2.4 super关键字 2.4.1 子类对象实例化 三、多态性 3.1 多态性的理解 3.2 向下转型与多态练习 四、Ob…

ArmSoM-Sige7 成为首款支持 openSUSE 的 RK3588 设备

随着嵌入式系统和开源软件的不断发展&#xff0c;越来越多的开发者和爱好者对高性能的开发板及其操作系统支持寄予厚望。在这一背景下&#xff0c;ArmSoM-Sige7 凭借其强大的硬件性能和广泛的软件兼容性&#xff0c;成为了市场的关注焦点。令人兴奋的是&#xff0c;ArmSoM-Sige…

linux 配置ssh免密登录

一、 cd /root/.ssh/ #不存在就创建mkdir /root/.ssh ssh-keygen #连续按4个回车 ll二、将公钥发送到目标服务器下 #公钥上传到目标服务器 ssh-copy-id root192.168.31.142 #回车完也是要输入密码的 #测试一下免密登录&#xff1a; ssh root192.168.31.142 成功

spring如何解决bean循环依赖的问题

1、概述 spring中&#xff0c;存在A依赖B&#xff0c;同时B又依赖A的情况&#xff0c;这种情况下&#xff0c;spring如何进行bean初始化呢&#xff1f; Service public class A {Autowiredprivate B b; }Service public class B {Autowiredprivate A a; } 本文来解释这个问题…

Mindustry像素工厂服务器开服教程

1、购买后登录服务器&#xff08;百度莱卡云游戏面板&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;大约5分钟左右就能安装完成 2、等待服务器运行起来 等待正常运行时间的表变成灰色之后就可以连接游戏了 3、连接游戏 先复制服务器的地址&#xff0c;单击地址…

【fisco学习记录2】多群组搭建

说明 文档参考&#xff1a; 多群组部署 — FISCO BCOS 2.0 v2.11.0 文档 (fisco-bcos-documentation.readthedocs.io) 多群组搭建之前&#xff0c;先暂停之前的单群组&#xff0c;并删除&#xff1a; cd fisco bash nodes/127.0.0.1/stop_all.sh rm -rf nodes/ 实现图&…

又一款国产自动化测试平台,开源了!

“时间就是金钱&#xff0c;效率就是生命”&#xff0c;在当下的社会里不仅我们的生活节奏变得越来越快&#xff0c;软件研发上线的节奏也是如此。在如此快节奏的软件开发环境中&#xff0c;高质量的软件测试变得尤为重要。 为了提高测试的效率和质量&#xff0c;建设一个强大…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(初级)

前言 哈喽哈喽友友们,这里是zyll~(小北)智慧龙阁的创始人及核心技术开发者。在技术的广阔天地里,我专注于大数据与全栈开发,并致力于成为这一领域的新锐力量。通过智慧龙阁这个平台,我期望能与大家分享我的技术心得,共同探索技术的无限可能。 Ascend C编程:小北的技术…

【大数据技术基础 | 实验二】Linux基础:常用基本命令和文件操作

文章目录 一、实验目的二、实验要求三、实验环境四、常用基本命令1、验证cd和pwd命令2、验证ls命令3、验证mkdir命令4、验证cp、mv和rm命令 五、Linux文件操作1、验证touch命令2、验证cat命令3、验证more命令 六、实验心得 一、实验目的 学会linux常用命令(cd,ls,pwd,mkdir,rm…

元器件行业常用软件推荐-加速度JSUDO

元器件行业中&#xff0c;工程师们会使用多种软件来辅助设计、仿真、布局、布线和验证等工作。以下是一些推荐的软件&#xff0c;它们在电子设计自动化&#xff08;EDA&#xff09;和集成电路&#xff08;IC&#xff09;设计领域中被广泛使用&#xff1a; Altium Designer&…

创建包含可导入浏览器信任的SSL自签名证书

问题&#xff1a;现在的三大浏览器&#xff0c;chrome、edge、firefox 一般都默认启用https检查&#xff0c;这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…