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

news2024/10/16 21:32:38

目录

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类型的。

感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

CSS选择器及背景属性介绍

1.复合选择器 &#xff08;1&#xff09;后代选择器 &#xff08;2&#xff09;子代选择器 &#xff08;3&#xff09;并集选择器 &#xff08;4&#xff09;交集选择器 2.伪类选择器 即鼠标所悬停的内容变色 扩展&#xff1a;伪类选择器关于超链接 3.CSS三大特性 &#xff…

路由表来源(基于华为模拟器eNSP)

概叙 在交换网络中&#xff0c;若要实现不同网段之间的通信&#xff0c;需要依靠三层设备&#xff08;路由器、三层交换机等&#xff09;&#xff0c;而路由器只知道其直连网段的路由条目&#xff0c;对于非直连的网段&#xff0c;在默认情况下&#xff0c;路由器是不可达的&a…

心理咨询评估|基于springBoot的学生心理咨询评估系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信…

Metasploit渗透测试之社会工程学工具SET

概述 社会工程师工具包&#xff08;SET&#xff09;是一个开源渗透测试框架&#xff0c;专门设计用于对人为因素执行高级攻击&#xff0c;并迅速成为渗透测试人员武器库中的标准工具。SET是TrustedSec&#xff0c;LLC的产品&#xff0c;TrustedSec&#xff0c;LLC是一家位于俄…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

安装指定node.js 版本 精简版流程

首先 我们本机上是否安装有node 如果有 需要先卸载 卸载完成后 使用命令查看是否卸载干净 打开WinR 输入cmd 然后输入如下名: where node 如果没有目录显示 说明node 很干净 本机没有相关安装 在输入命令: where npm 如果有相关目录 需要删除掉 要不然 后续安装的…

阿里云数据库导出 | 数据管理(兼容数据库备份)

文章目录 1、数据库导出2、操作步骤3、DMS - Data Management Service 1、数据库导出 2、操作步骤 3、DMS - Data Management Service

MySQL 【日期】函数大全(五)

目录 1、QUARTER() 返回一个指定日期所在季度值。 2、SEC_TO_TIME() 将指定的秒数转为一个格式为 HH:MM:SS 的时间值。 3、SECOND() 提取并返回时间的秒部分。 4、STR_TO_DATE() 将指定的字符串根据指定日期格式转为日期/时间。 5、SUBDATE() 在指定的日期/时间上减去指定…

127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

一、板卡概述: FMC 高速 AD 模块 FL9627 为 4 路 125MSPS&#xff0c; 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片&#xff0c;每个 AD9627 芯片支持 2 路 AD 输入转换&#xff0c;所以 2 片 AD9627 芯片一共支持 4 路的 AD 输入…

FLORR.IO回顾

No.1 subulaxi No.2 qwert 2青加全红 我将在2024.11.1退游!

Wails 学习笔记:Wails核心思想理解

文章目录 1. Wails 的核心思想2. 工作流程2.1 前端渲染2.2 后端逻辑2.3 前后端通信2.4 应用打包与分发 3. Wails 主要组件3.1 WebView3.2 事件与数据绑定3.3 窗口管理 4. Wails 的优点5. Wails 的使用场景6. 启动函数Runwails.Run() 的主要功能wails.Run() 的参数&#xff1a;w…

MySQL8.0.28解压版安装windows

1.下载 https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-winx64.zip 2.文档 MySQL :: MySQL 8.0 Reference Manual :: 2.3.4 Installing MySQL on Microsoft Windows Using a noinstall ZIP Archive 3.创建配置文件my.ini。默认解压文件中没有 内容如下&#xff…

【LangChain系列1】【LangChain表达式 (LCEL)】

目录 前言一、LangChain1-1、介绍1-2、LangChain抽象出来的核心模块1-3、特点1-4、langchain解决的一些行业痛点1-5、安装 二、LangChain表达式——LCEL2-1、LCEL介绍2-2、基本示例&#xff1a;提示 模型 输出解析器2-3、接口 附录、ZhiPuAI API0、安装1、设置API密钥2、基本…

无法获得下列许可 SolidWorks standard。无法连接到服务器(-15,10,10061)

太久没启动SolidWorks&#xff0c;今天想打开&#xff0c;结果给我报错&#xff0c;如下图所示&#xff1a; 看网上说是开机启动项被杀毒软件给关了&#xff0c;于是打开360&#xff0c;看了一下&#xff0c;果然&#xff1a; 还有好几个和SolidWorks相关的项目&#xff0c;这里…

WebRTC音频 04 - 关键类

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架 WebRTC音频 04 - 关键类(本文) 一、前言&#xff1a; 在WebRTC音频代码阅读过程中&#xff0c;我们发现有很多关键的类比较抽象&#xff0c;搞不清楚会导致代码阅读一脸懵逼。比如…

吴恩达深度学习笔记(5)

调试处理&#xff08;随机采样、非格网、由粗到细&#xff09;及超参数 深度学习中涉及大量超参数&#xff0c;如下所示 在不知道哪个参数更为重要的情况下&#xff0c;机器学习参数较少&#xff0c;可以利用网络化的参数取值试验&#xff0c;但是深度学习参数较多的情况下&am…

通过华为鲲鹏认证的软件产品如何助力信创产业

软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措&#xff0c;通过该认证&#xff0c;软件可以在华为的生态系统中实现更好的兼容性和性能优化&#xff0c;从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲鹏…

POMO:强化学习的多个最优策略优化(2020)(完)

文章目录 Abstract1 Introduction2 Related work3 Motivation4 多最优策略优化(POMO)4.1 从多个起始节点进行探索4.2 策略梯度的共享基线4.3 用于推理的多个贪婪轨迹5 Experiments5.1 Traveling salesman problem5.2 带容量限制得车辆路径问题5.3 0-1背包问题6 ConclusionAbs…

【黑马redis基础篇】介绍和数据类型

1.NoSQL //来源&#xff1a;02 NoSQL类型&#xff1a;键值、文档、图 NoSQL特点&#xff1a;非结构化的、无关联的、非SQL、BASE(无法满足事务ACID) 2.认识Redis //来源03 基于内存的键值型NoSQL数据库。全称远程词典服务器。 2.1特征 &#xff08;1&#xff09;键值型&a…