当前位置: 首页 > news >正文

Json快速入门

引言

Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化,它实现了将多个数据对象组织成 为Json格式字符串,以及将 Json 格式字符串解析得到多个数据对象的功能,独立于开发语言。

Json数据对象

Json数据对象类的表示:

class Json::Value{Value &operator=(const Value &other); //Value重载了[]和=,因此所有的赋值和获取数据都可以通过 Value& operator[](const std::string& key);//简单的⽅式完成 val["name"] = "xx";Value& operator[](const char* key);Value removeMember(const char* key);//移除元素 const Value& operator[](ArrayIndex index) const; //val["score"][0]Value& append(const Value& value);//添加数组元素val["score"].append(88);  ArrayIndex size() const;//获取数组元素个数 val["score"].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;//转float float weight = val["weight"].asFloat(); bool asBool() const;//转 bool bool ok = val["ok"].asBool(); 
};

上面列举了Json数据对象Json::Value的一些成员方法, Json::Value是用来存储数据的,可以把它理解为一个容器。序列化方法和反序列化方法就可以将传入的Json::Value数据对象进行序列化和反序列化操作。

Json基本语法规则

Json通常采用KeyValue的格式。例如:“姓名”:“小颖”,中间用冒号:隔开。其中,键名必须为字符串且必须用双引号包裹。

{ "key": "value" }  // ✅ 正确
{ key: "value" }    // ❌ 错误

Json中还有另一种数据结构——数组。用中括号[ ]包裹起来,里面的值的类型可以不同。

 ["苹果", "香蕉", 123, true]

序列化接口

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;//......
}

可以看得出来,这里用到了一种设计模式——工厂模式。 也就是说使用StreamWriterBuilder 来生产StreamWriter对象。write就是序列化接口,第一个参数为存储数据的Value对象,第二个参数为输出流对象的指针。StreamWriter用于将JSON数据写入到输出流中,StreamWriterBuilder则是用来配置和创建StreamWriter实例的。所谓配置,就是配置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;
}

和序列化一样,这里同样用到了工厂设计模式。CharReaderBuilder 负责配置解析规则,然后由CharReader来进行解析。CharReader不能直接创建对象,因为它里面有个纯虚函数,所以它是个抽象类。创建对象的职责由CharReaderBuilder来承担。函数parse就是用来完成反序列化的。

序列化和反序列化代码演示

#include <iostream>
#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>//序列化
bool Serialize(const Json::Value val, std::string &body)
{std::stringstream ss;//构建StreamWriter对象Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());int ret = sw->write(val, &ss);//成功返回0,失败返回-1if(ret != 0){std::cout << "serialize faild\n";return false;}body = ss.str();return true;
}//反序列化
bool unserialize(const std::string &body, Json::Value&val)
{Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string errs;bool ret = cr->parse(body.c_str(), body.c_str() + body.size(), &val, &errs);if(ret == false){std::cout << "unserialize faild : " << errs << std::endl;return false;}return true;
}int main()
{Json::Value stu;stu["姓名"] = "小颖";stu["年龄"] = 19;//构建数组,不能直接stu["爱好"] = ["打羽毛球", "吃吃吃", "散步"];stu["爱好"].append("打羽毛球");stu["爱好"].append("吃吃吃");stu["爱好"].append("散步");std::string body;Serialize(stu, body);std::cout << body << std::endl;std::string str = R"({"姓名":"小北", "年龄":20})";//C++11的一种新语法,定义一个字符串Json::Value student;bool ret = unserialize(str, student);//将字符串反序列化if(ret == false)return -1;std::cout << "姓名:" << student["姓名"].asString() << std::endl;std::cout << "年龄:" << student["年龄"].asInt() << std::endl;return 0;
}//运行结果
{"\u59d3\u540d" : "\u5c0f\u9896","\u5e74\u9f84" : 19,"\u7231\u597d" : ["\u6253\u7fbd\u6bdb\u7403","\u5403\u5403\u5403","\u6563\u6b65"]
}
姓名:小北
年龄:20

相关文章:

Json快速入门

引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化&#xff0c;它实现了将多个数据对象组织成 为Json格式字符串&#xff0c;以及将 Json 格式字符串解析得到多个数据对象的功能&#xff0c;独立于开发语言。 Json数据对象 Json数据对象类的表示&#xff1a; …...

【QT】学习笔记1

QT概述 Qt是一个1991年由QtCompany开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器&#xff08;…...

【Kafka基础】生产者命令行操作指南:从基础到高级配置

Kafka作为分布式消息系统&#xff0c;其生产者是数据管道的起点。掌握kafka-console-producer.sh工具的使用对于开发测试和运维都至关重要。本文将系统介绍该工具的各种用法&#xff0c;帮助您高效地向Kafka发送消息。 1 基础消息生产 1.1 最简单的消息发送 /export/home/kafk…...

【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识 引言 Spring Boot作为Java生态中最流行的框架之一&#xff0c;其自动配置机制和Starter开发是面试中的高频考点。对于3-5年经验的Java开发者来说&#xff0c;深入理解这些原理…...

reid查找余弦相似度计算修正(二)

上一篇文章 reid查找余弦相似度计算(一) 上一篇的遗留问题就是reid 的结果部分正确&#xff0c;我们参考一下 fast-reid的demo&#xff0c;把里面的抽取特征提取出来 修改提取特征 首先发现图像改变大小的不同&#xff0c;fast 使用的是[128&#xff0c;384]&#xff0c; 如…...

嵌入式---加速度计

一、基本概念与定义 定义 加速度计&#xff08;Accelerometer&#xff09;是一种测量物体加速度&#xff08;线性加速度或振动加速度&#xff09;的传感器&#xff0c;可检测物体运动状态、振动幅度、倾斜角度等&#xff0c;输出与加速度成比例的电信号&#xff08;模拟或数字信…...

Redis如何判断哨兵模式下节点之间数据是否一致

在哨兵模式下判断两个Redis节点的数据一致性&#xff0c;可以通过以下几种方法实现&#xff1a; 一、检查主从复制偏移量 使用INFO replication命令 分别在主节点和从节点执行该命令&#xff0c;比较两者的master_repl_offset&#xff08;主节点&#xff09;和slave_repl_offs…...

Spring 核心注解深度解析:@Autowired、@Repository 与它们的协作关系

引言 在 Spring 框架中&#xff0c;​依赖注入&#xff08;DI&#xff09;​​ 是实现松耦合架构的核心机制。Autowired 和 Repository 作为两个高频使用的注解&#xff0c;分别承担着 ​依赖装配​ 和 ​数据访问层标识​ 的关键职责。本文将深入探讨它们的功能特性、协作模式…...

LeetCode541反转字符串②

思路&#xff1a; 关键是判断反转的右边界&#xff0c; ①当剩余字符数<k&#xff0c;是反转当前所有字符&#xff0c;右边界就是rightlen-1&#xff0c;不可以超过len-1&#xff0c;会越界&#xff1b; ②当剩余字符数>k且<2k,反转k个字符&#xff0c;右边界就是righ…...

Ubuntu 22 Linux上部署DeepSeek+RAG知识库操作详解(Dify方式)之2

上一篇在ubuntu上通过docker拉取了dify并启动与它相关的服务&#xff0c;本篇主要介绍两个知识点&#xff1a; 一是配置模型&#xff0c;使用之前通过Xinference搭建的本地deepseek模型&#xff0c;启动过程参考前期文档&#xff0c;这里就不做介绍了。&#xff08;注意一点&a…...

如何在多线程中安全地使用 PyAudio

1. 背景介绍 在多线程环境下使用 PyAudio 可能会导致段错误&#xff08;Segmentation Fault&#xff09;或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。 PyAudio 是一个用于音频输入输出的 Python 库&#xff0c;它依赖于 PortAu…...

Spring MVC与Spring Boot文件上传配置项对比

Spring MVC与Spring Boot文件上传配置项对比 一、Spring MVC配置项&#xff08;基于不同MultipartResolver实现&#xff09; 1. 使用 CommonsMultipartResolver&#xff08;Apache Commons FileUpload&#xff09; Bean public MultipartResolver multipartResolver() {Common…...

多类型医疗自助终端智能化升级路径(代码版.上)

大型医疗自助终端的智能化升级是医疗信息化发展的重要方向,其思维链一体化路径需要围绕技术架构、数据流协同、算法优化和用户体验展开: 一、技术架构层:分布式边缘计算与云端协同 以下针对技术架构层的分布式边缘计算与云端协同模块,提供具体编程实现方案: 一、边缘节点…...

Chrome 浏览器插件收录

1. Responsive Viewer 可以在同个窗口内&#xff0c;针对同一网站&#xff0c;添加多个不同设备屏幕显示。 在前端开发&#xff0c;需要多端适配&#xff0c;尤其是移动端响应式适配的网站开发中&#xff0c;可以同时测试多个不同屏幕的适配效果。 2. VisBug 提供工具栏&#x…...

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...

文档大模型

处理流程&#xff1a; 对表格或者文章文档切分成chunk&#xff0c;将其存入DB根据chunk文档内容&#xff0c;通过prompt生成问题&#xff08;qwen&#xff09;通过sentencetransformer生成embbedding(Text embedding 模型 stella_large 模型&#xff0c;长文本编码), 第二步 抽…...

基于分布式指纹引擎的矩阵运营技术实践:突破平台风控的工程化解决方案

一、矩阵运营的技术痛点与市场现状 风控机制升级 主流平台通过复合指纹识别&#xff08;Canvas渲染哈希WebGL元数据AudioContext频率分析&#xff09;检测多账号关联传统方案成本&#xff1a;单个亚马逊店铺因关联封号月均损失$5000&#xff0c;矩阵规模越大风险指数级增长 …...

SpringBoot 统一功能处理

1.拦截器 1.1什么是拦截器 拦截器是Spring框架提供的核心功能之一&#xff0c;主要是用来拦截用户的请求&#xff0c;在用户请求指定的方法执行前后&#xff0c;可以根据业务需要执行实现预定的代码。 通过拦截器&#xff0c;开发人员就可以根据需求针对一些特殊的请求&#…...

Redis到底能不能做主数据库?

张三拍案而起&#xff1a;“Redis 是缓存数据库&#xff0c;怎么能当主数据库用&#xff1f;简直是天方夜谭&#xff01;” 李四冷笑回应&#xff1a;“你没用过&#xff0c;凭什么说不行&#xff1f;我已经用 Redis 做主数据库好几年了&#xff0c;系统稳定得像铁板一块&…...

C++ 基础进阶

C 基础进阶 内容概述&#xff1a; 函数重载&#xff1a;int add(int x, inty);&#xff0c;long long add(long long x, long long y);&#xff0c;double add(double x, double y);模板函数&#xff1a;template<typename T> 或 template<class T>结构体&#x…...

从C语言到Go语言:新手快速入门指南

对于刚学会C语言的新手来说&#xff0c;学习Go语言&#xff08;Golang&#xff09;可能是一个既有趣又有挑战性的过程。Go语言由Google开发&#xff0c;以简洁、高效和并发支持著称&#xff0c;被广泛用于现代软件开发。相比C语言&#xff0c;Go语言在语法上更加现代化&#xf…...

Vue.js 中 v-model 的使用及其原理

在 Vue.js 开发中&#xff0c;v-model是一个非常重要且常用的指令。它极大地简化了表单元素与数据之间的双向绑定操作&#xff0c;让开发者能够更高效地处理用户输入和数据更新。接下来&#xff0c;我们将深入探讨v-model的使用场景及其背后的工作原理。​ 一、v-model 的基本…...

深入解析哈希表:从原理到实现(拉链法详解)

哈希表&#xff08;Hash Table&#xff09;是计算机科学中最重要的数据结构之一&#xff0c;它能够在平均 O(1) 时间内完成数据的插入、删除和查找操作。本文将围绕**拉链法&#xff08;Chaining&#xff09;**的实现&#xff0c;结合代码示例和图示&#xff0c;深入讲解哈希表…...

okcc呼叫中心系统坐席签入长签和普通签入的区别

在OKCC呼叫中心系统中&#xff0c;坐席的长签&#xff08;持久签入&#xff09;与普通签入&#xff08;常规签入&#xff09;是两种不同的登录模式&#xff0c;主要区别体现在 会话保持时长、资源占用、业务场景适配性 等方面。以下是具体对比&#xff1a; 一、核心区别对比 维…...

2024年博客之星的省域空间分布展示-以全网Top300为例

目录 前言 一、2024博客之星 1、所有排名数据 2、空间属性管理 二、数据抓取与处理 1、相关业务表的设计 2、数据抓取处理 3、空间查询分析实践 三、数据成果挖掘 1、省域分布解读 2、技术开发活跃 四、总结 前言 2024年博客之星的评选活动已经过去了一个月&#xf…...

7.3 在通知中显示图片或视频(UNNotificationAttachment)

在iOS通知中显示富媒体内容可以显著提升用户体验。通过UNNotificationAttachment&#xff0c;我们可以为本地和远程通知添加图片、音频、视频等内容。 基本实现方法 1. 创建带附件的通知 func scheduleNotificationWithImage() {// 1. 创建通知内容let content UNMutableNo…...

1.5-APP的架构\微信小程序的架构

1.5-APP的架构\微信小程序的架构 APP的三种开发架构&#xff1a; 原生态APP类型 APP-开发架构-原生态-IDEA 演示&#xff1a;remusic项目源码 NP管理器&#xff1a; http://normalplayer.top/ HttpCanary&#xff1a;https://github.com/mingww64/HttpCanary-SSL-Magisk 安全影…...

Python缩进完全指南:语法规则、使用场景与最佳实践

一、Python缩进的核心概念 Python的缩进不仅是代码风格问题&#xff0c;更是语法的一部分&#xff0c;这是Python区别于其他编程语言最显著的特征之一。 1.1 什么是缩进&#xff1f; 缩进是指在代码行前添加空格或制表符来实现代码块的层级结构。在Python中&#xff0c;缩进…...

高通音频数据从HAL到DSP

概述 参考高通平台8155 从数据流的角度整理下安卓平台音频数据从HAL层到达DSP这个流程; 以 MultiMedia22 --> QUIN_TDM_RX_0 播放为例; 主要关注pcm数据写到dsp, 以及将前后端路由信息告知dsp两个点。 <!-- more --> [Platform:高通 8155 gvmq Android 11] [Ker…...

第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型

Unity Shader的学习笔记 第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型 文章目录 Unity Shader的学习笔记前言一、漫反射光照模型1.逐像素光照① 更改v2f② 传递法线信息给片元着色器③ 片元着色器计算漫反射光照模型 二.半兰伯特模型总结 前言 提示&am…...

【RabbitMQ】队列模型

1.概述 RabbitMQ作为消息队列&#xff0c;有6种队列模型&#xff0c;分别在不同的场景进行使用&#xff0c;分别是Hello World&#xff0c;Work queues&#xff0c;Publish/Subscribe&#xff0c;Routing&#xff0c;Topics&#xff0c;RPC。 下面就分别对几个模型进行讲述。…...

【Java设计模式】第3章 软件设计七大原则

3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…...

Axure中继器(Repeater): 列表展示

文章目录 引言I 中继器说明中继器的作用中继器的结构中继器例子II 中继器基础应用:列表展示表头制作列表内容表头中的列与中继器的列绑定填充数据内容引言 中继器是Axure RP 7.0推出的新功能,用于快速设计一些复杂的交互界面(制作“高保真”的动态原型)。 I 中继器说明 中…...

mybatis的第五天学习笔记

12. 动态SQL 12.1 动态SQL概述 新增内容&#xff1a; 动态SQL执行流程 MyBatis如何解析动态SQLSQL语句构建过程参数绑定机制 新增示例 // 动态条件查询接口示例 List<User> searchUsers(Param("name") String name,Param("age") Integer age,Para…...

LeetCode 941 有效的山脉数组

算法探索&#xff1a;如何精准判断有效山脉数组 在计算机科学领域&#xff0c;算法和数据结构堪称基石&#xff0c;它们不仅是解决复杂问题的有力工具&#xff0c;更是衡量程序员技术水平的重要指标。数组作为最基础、应用最广泛的数据结构之一&#xff0c;围绕它衍生出了大量…...

java设计模式-单例模式

单例模式 1、饿汉式(静态常量) Slf4j public class SingletonTest01 {public static void main(String[] args) {Singleton singleton Singleton.getInstance();Singleton singleton2 Singleton.getInstance();log.info("比对结果&#xff1a;{}",singletonsingl…...

对抗Prompt工程:构建AI安全护栏的攻防实践

大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例&#xff0c;揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理&#xff0c;提出融合动态意图拓扑分析&#xff08;DITA&#xff09;、对抗…...

CentOS 环境下 MySQL 数据库全部备份的操作指南

最近阿里云个人服务到期&#xff0c;因为是很久之前买的测试机器&#xff0c;配置较低&#xff0c;上面运行的有技术博客 和以往的测试项目&#xff0c;所以准备放弃掉。 需要备份下上面的表结构和数据、以及代码仓库。 下面是一个完整的 CentOS 环境下 MySQL 数据库全部备份…...

回溯算法补充leetcode

1. 组合 leetcode题目链接&#xff1a;77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示…...

利用 AI 实现雷池 WAF 自动化运维

欢迎加入雷池社区&#xff1a;雷池 WAF | 下一代 Web 应用防火墙 | 免费使用 已经升级到 8.4.0 的兄弟们应该会发现雷池又多了一些 AI 能力&#xff0c;8.4.0 更新公告。 感谢 Web2GPT 为雷池提供的 AI 能力支持。 主要变化 右下角多了一个 AI 小助手 按钮右上角多了一个 连…...

【嵌入式面试】

1、如果中断函数中有耗时较长的内容&#xff0c;会导致以下问题&#xff0c;如何解决&#xff1f; 对系统实时性的影响 阻塞低优先级中断&#xff1a;中断函数执行时间过长&#xff0c;会阻塞其他低优先级中断的响应。例如&#xff0c;如果一个高优先级中断处理程序中包含耗时…...

【Hadoop入门】Hadoop生态之HDFS

1 HDFS核心设计原理 HDFS&#xff08;Hadoop Distributed File System&#xff09;是专为大规模数据存储设计的分布式文件系统&#xff0c;其核心设计基于以下原则&#xff1a; 数据分块与分布式存储&#xff1a; 分块机制&#xff1a;文件被切分为固定大小的数据块&#xff08…...

试剂SYBR 14核酸染料在染色时的操作步骤(说明)

化学试剂的基本内容||试剂参数 ---中文名&#xff1a;SYBR 14核酸染料 ---英文名&#xff1a;SYBR 14 Nucleic Acid Stain ---浓度&#xff1a;通常以5mM的DMSO储存液形式提供。 ---吸收波长&#xff1a;488nm ---发射波长&#xff1a;518nm ---出厂商&#xff1a;西安强…...

Spring Boot 国际化配置项详解

Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别&#xff0c;便于快速定位&#xff1a; 1.1 消息源配置&#xff08;MessageSource 相关&#xff09; 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…...

Python之禅:深入理解Python设计哲学

Python之禅(The Zen of Python)是Python语言的核心设计哲学&#xff0c;由Python创始人Guido van Rossum和Tim Peters共同制定。理解Python之禅不仅能帮助我们写出更"Pythonic"的代码&#xff0c;还能深入把握Python语言的设计理念。 Python之禅的由来 Python之禅最…...

Rancher 全面介绍

目录 Rancher 全面介绍1. **Rancher 的定义与核心功能**2. **Rancher 的应用场景**3. **Rancher 的生态系统**4. **Rancher 的优势**5. **总结** Rancher 全面介绍 1. Rancher 的定义与核心功能 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台&#xff0c;旨在简化容…...

Docker常用命令

镜像命令 搜索镜像 docker search nginx 拉取镜像 docker pull nginx&#xff0c;默认拉取最新镜像 docker pull nginx:1.25.3&#xff0c;拉取指定版本 查看镜像 docker images 删除镜像 docker rmi nginx:1.25.3 docker rmi -f $(docker images -aq)&#xff0c;删除全…...

项目中如何防止超卖

什么是超卖&#xff1f;假如只剩下一个库存&#xff0c;却被多个订单买到了&#xff0c;简单理解就是库存不够了还能正常下单。 方案1&#xff1a;数据库行级锁 1. 实体类 Data TableName("product") public class Product {TableId(type IdType.AUTO)private Lon…...

龙虎榜——20250408

行情如下 根据2025年4月8日的龙虎榜的行业分析如下&#xff1a; 一、农业种植与乡村振兴 • 政策催化&#xff1a;推进种业自主创新、农机装备升级等目标&#xff0c;叠加中美关税反制逻辑。 • 市场表现&#xff1a; • 农业种植&#xff1a;种子类企业因国产替代预期受资…...

快速上手Vue3国际化 (i18n)

文章目录 一、背景介绍二、页面效果三、使用步骤四、代码1.src/App.vue2.src/main.js3.src/locales/index.js4.src/views/login/_request.js5.src/locales/en.json6.src/locales/zh.json7.SystemParam.vue8.I18NController.java9.DataServiceConfigValue.java10.ConfigValue.ja…...