JSONCPP 数据解析与序列化

常用类接口

Json::Value 类

用于存储 JSON 数据的核心类。它支持将数据解析为对象、数组或基本类型(如字符串、数值等)

赋值操作符:Value& operator=(Value other);

用于将一个 JSON 值赋给另一个 JSON 值

Json::Value value;
value = "Hello, World!";

访问操作符:Value& operator[](const char* key);

用于访问或设置对象属性的值

Json::Value value;
value["姓名"] = "张三";

数组追加:Value& append(const Value& value);

向数组类型的 Value 添加新元素

Json::Value value;
value["成绩"].append(88);

获取字符串值:std::string asString() const;

Value 转换为字符串

std::string name = value["姓名"].asString();

获取数组大小:ArrayIndex size() const;

返回数组类型的 Value 的元素个数

Json::Value value;
value["成绩"].append(88);
value["成绩"].append(76);
std::cout << value["成绩"].size(); // 输出:2

通过下标访问数组元素:Value& operator[](ArrayIndex index);

用于访问数组中的某个元素

float score = value["成绩"][0].asFloat();

Write类

Writer 类负责将 Json::Value 对象序列化为字符串或流输出

StreamWriter 接口

  • 用于实现自定义的序列化逻辑
  • root:要序列化的 JSON 对象
  • sout:输出流
virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0;

StreamWriterBuilder

通过工厂方法生成 StreamWriter 对象

StreamWriter* newStreamWriter();
Json::StreamWriterBuilder builder;
std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
writer->write(value, &std::cout);

Reader类

CharReader 接口

定义了从字符串解析 JSON 数据的核心方法

  • beginDocendDoc:指向 JSON 文本的起始和结束位置
  • root:解析后的 JSON 数据存放的目标 Value 对象
  • errs:解析过程中的错误信息
virtual bool parse(char const* beginDoc, char const* endDoc,Value* root, JSONCPP_STRING* errs) = 0;

CharReaderBuilder

提供生成 CharReader 对象的工厂方法

CharReader* newCharReader();//事例使用
Json::CharReaderBuilder builder;
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
Json::Value root;
std::string errors;
std::string jsonText = R"({"name": "张三", "age": 25})";
reader->parse(jsonText.c_str(), jsonText.c_str() + jsonText.size(), &root, &errors);

基本使用

序列化

#include<json/json.h>
#include<memory>
#include<sstream>
#include<iostream>using namespace std;bool Serialize(const Json::Value &val,std::string &dst)
{Json::StreamWriterBuilder swb;swb.settings_["emitUTF8"] = true;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;int ret = sw->write(val,&ss);if(ret != 0){std::cout<<"Json 反序列化失败\n";return false;}dst = ss.str();return true;
}int main()
{char name[] = "猪猪侠";int age = 18;float score[3] = {0,100,20};Json::Value stu;stu["姓名"] = name;stu["年龄"] = age;stu["成绩"].append(score[0]);stu["成绩"].append(score[1]);stu["成绩"].append(score[2]);std::string stu_str;bool ret = Serialize(stu,stu_str);if(ret == false) return -1;std::cout<<stu_str <<std::endl;return 0;
}

反序列化

#include<json/json.h>
#include<memory>
#include<sstream>
#include<iostream>using namespace std;bool Serialize(const Json::Value &val,std::string &dst)
{Json::StreamWriterBuilder swb;swb.settings_["emitUTF8"] = true;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;int ret = sw->write(val,&ss);if(ret != 0){std::cout<<"Json 反序列化失败\n";return false;}dst = ss.str();return true;
}bool UnSerialize(const std::string &src , Json::Value &val)
{Json::CharReaderBuilder crb;crb.settings_["emitUTF8"] = true;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;bool ret = cr->parse(src.c_str(),src.c_str()+src.size(),&val,&err);if(ret == false){std::cout<<"Json反序列化失败"<<err<<std::endl;return false;}return true;
}int main()
{char name[] = "猪猪侠";int age = 18;float score[3] = {0,100,20};Json::Value stu;stu["姓名"] = name;stu["年龄"] = age;stu["成绩"].append(score[0]);stu["成绩"].append(score[1]);stu["成绩"].append(score[2]);std::string stu_str;bool ret = Serialize(stu,stu_str);if(ret == false) return -1;std::cout<<stu_str <<std::endl;Json::Value val;ret = UnSerialize(stu_str,val);if(ret == false) return -1;std::cout<<val["姓名"].asString()<<std::endl;std::cout<<val["年龄"].asInt()<<std::endl;int sz = val["成绩"].size();for(int i =0;i<sz;++i){std::cout<<val["成绩"][i].asFloat()<<std::endl;}return 0;
}

JSONCPP局限性了解

  • 内存开销大,因为其需要非常大的JSON数据集
  • 高性能场景下还是选择更加轻量化的方案
  • JSONCPP本身不是线程安全的,所以多线程环境下需要设置同步机制

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

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

相关文章

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…

ChatGPT 桌面版发布了,如何安装?

本章教程教大家如何进行安装。 一、下载安装包 官网地址地址&#xff1a;https://openai.com/chatgpt/desktop/ 支持Windows和MacOS操作系统 二、安装步骤 Windows用户下载之后&#xff0c;会有一个exe安装包&#xff0c;点击运行安装即可。 注意事项&#xff0c;如果Windows操…

【Electron学习笔记(二)】基于Electron开发应用程序

基于Electron开发本地应用程序 基于Electron开发本地应用程序前言正文1、创建 pages 目录2、创建 index.html 文件3 、创建 html.css 文件4 、main.js里引入页面5 、运行 start 命令6 、启用开发者模式7 、解决内容安全策略8、完善窗口行为9、配置自动重启&#xff0c;保存后自…

力扣--LCR 154.复杂链表的复制

题目 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 提示&#xff1a; -10000 < Node.val < 10000 Node.random 为…

windows server 2019 启动 nginx 报错

环境 &#xff1a;windows server 2019 &#xff0c;nginx-1.19.7 背景&#xff1a; 自己经常用这个 nginx 包作为 web 服务器。今天发现 部署到 server 2019 上直接报错了。这可是原生的包&#xff0c;我啥也没改&#xff0c;怎么可能报错。而且之前在 其他服务器用都没问题…

在ASP.NET Core WebAPI 中使用轻量级的方式实现一个支持持久化的缓存组件

前言 在 WebAPI 开发中&#xff0c;缓存是一种常用的优化手段。Redis 是广泛使用的缓存解决方案&#xff0c;但在某些场景下&#xff0c;我们可能不希望引入第三方依赖&#xff0c;而是希望使用轻量级的方式实现一个支持持久化的缓存组件&#xff0c;满足以下需求&#xff1a;…

【区块链】深入理解椭圆曲线密码学(ECC)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

内存不足引发C++程序闪退崩溃问题的分析与总结

目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败&#xff0c;返回NULL 2.2、new申请内存失败&#xff0c;抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…

设计模式之代理模式(模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景)

前言&#xff1a; 写写CRUD&#xff0c;不会的百度一下&#xff0c;就完事了&#xff0c;总觉得别人问的东西像在造火箭一样。但在高体量、高并发的业务场景下&#xff0c;每一次的压测优化&#xff0c;性能提升&#xff0c;都像在研究一道数学题一样&#xff0c;反复的锤炼&am…

Java项目实战II基于微信小程序的图书馆自习室座位预约平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在知识爆炸的时代&#xff0c;图书馆和…

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

智慧社区管理系统平台提升物业运营效率与用户体验

内容概要 智慧社区管理系统平台是一个集成了多项功能的综合性解决方案&#xff0c;旨在通过先进的技术手段提升物业管理的效率和居民的生活质量。该平台不仅关注物业运营的各个方面&#xff0c;还强调用户体验的重要性。随着科技的发展&#xff0c;社区管理方式正发生着翻天覆…

使用脚本实现hadoop-yarn-flink自动化部署

本文使用脚本实现hadoop-yarn-flink的快速部署&#xff08;单机部署&#xff09;。 环境&#xff1a;①操作系统&#xff1a;CentOS 7.6&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 1.前置条件 把下面的的脚本保存到“pre-install.sh”文件&#x…

【vue】vue中插槽slot的用法详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

爬虫获取的数据如何用于市场分析?

在数字化时代&#xff0c;数据已成为企业决策的重要资产。通过爬虫技术获取的数据可以为市场分析提供丰富的原材料。本文将探讨如何利用Python爬虫获取的数据进行市场分析&#xff0c;并提供代码示例。 1. 数据收集 首先&#xff0c;我们需要通过爬虫收集相关数据。以电商行业…

Linux高阶——1123—服务器基础服务器设备服务器基础能力

目录 1、服务器基础 1、服务器基本概述 2、服务器设计之初解决的问题 网络穿透 网络数据设备间的收发 3、服务器的类型C/S、B/S 2、服务器设备 将自己的服务器软件部署上线 3、代理服务器负载均衡&#xff0c;以及地址绑定方式 4、服务器的基础能力 1、服务器基础 1…

DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?

概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…

公网弹性绑定负载均衡收费吗?

公网弹性绑定负载均衡收费吗&#xff1f;公网弹性绑定负载均衡&#xff08;ELB&#xff09;是收费的。费用主要包括公网IP费、带宽费和负载均衡实例费。其中&#xff0c;带宽费可以按固定带宽或实际使用流量计费&#xff0c;而实例费则根据类型、规格和使用时长来定价。此外&am…

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

多头数(head number);d_model、d_k;词嵌入维度之间的关系;多头是对不同维度的特征分开提取,意义在于将并行执行

目录 多头是对不同维度的特征分开提取,意义在于将并行执行 之后的每头提取的特征仅仅进行矩阵拼接 多头数(head number) d_model、d_k 词嵌入维度之间的关系 词嵌入的维度(d_model)决定了权重矩阵的形状 一、概念解释 二、关系举例说明 多头数,权重矩阵的长度和词…