目录

JSON概述

nlohmann/json 库的使用

创建json数组/对象

字符串解析(parse反序列化)

数据访问

序列化

文件读写


JSON概述

JSON(JavaScrip Object Notation)是一种轻量级、跨语言的数据交换格式。它基于 ECMAScript 子集,以独立于编程语言的文本格式存储和表示数据,简洁清晰的结构使其成为理想的数据交换语言,易读、易写且便于机器解析生成,能提升网络传输效率 。

Json中主要有两种数据格式:Json数组和Json对象,并且这两种格式可以交叉嵌套使用。

Json数组使用 [] 表示,[]里边是元素,元素和元素之间使用逗号间隔。一个Json数组中支持同时存在多种不同类型的成员,包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null。由此可见Json数组比起C/C++数组要灵活很多。

Json对象使用 {} 来描述,每个Json对象中可以存储若干个元素,每一个元素对应一个键值对(key:value 结构),元素和元素之间使用逗号间隔。键值必须是字符串,同一对象里,键不能重复,否则解析时会出现覆盖。

在一个Json文件中只能有一个Json数组或者Json对象的根节点,不允许同时存储多个并列的根节点。

数组为根:体现 有序集合关系 ,数据按位置(索引)排列,适合描述批量、同构 / 异构的列表数据。更关注数据的 “顺序” 和 “批量性”,而非单个数据的语义标签。比如(批量用户列表场景);

[{"name": "ZY", "age": 20},{"name": "LMM", "age": 20}
]

对象为根:体现键值映射关系 ,每个数据有明确的 “语义标签(键名)”,适合描述复杂实体(如用户信息、配置项),阅读和维护时能通过键名快速理解数据含义。比如(用户信息场景):

{"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
}

nlohmann/json 库的使用

创建json数组/对象

创建数组:通过创建空数组逐步添加元素或直接初始化列表的形式创建。

json arr = { "ZY",20,true,{"C++","Linux","QT"} };json Arr = json::array();
Arr.push_back("ZY");
Arr.push_back(20);
Arr.push_back(true);
Arr.push_back({ "C++","Linux","QT" });

创建对象:通过创建空对象逐步添加键值对或直接初始化列表的形式创建。

json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };

字符串解析(parse反序列化)

std::string json_str = R"({"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
})";
json json_obj = json::parse(json_str);

把符合 JSON 格式的字符串转换成 nlohmann::json 类型的对象,也就是 “反序列化” 操作,让程序能方便地访问 JSON 里的数据 。 

数据访问

通过[]访问或者遍历,类似c++容器.demo:

std::cout << arr[3][0] << std::endl;
for (const auto& a : arr)
{std::cout << a << std::endl;
}
for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout<< *it << std::endl;
}std::cout << obj["skills"][2] << std::endl;
for (auto it = obj.begin(); it != obj.end(); ++it) {std::string key = it.key();       json value = it.value();          std::cout << "Key: " << key << ", Value: " << value << std::endl;
}for (auto& element : obj.items()) {std::string key = element.key();json value = element.value();std::cout << "Key: " << key << ", Value: " << value << std::endl;
}std::string name = json_obj["name"];
int age = json_obj["age"];
bool is_student = json_obj["is_student"];
std::vector<std::string> skills = json_obj["skills"];
// 输出结果
std::cout << "Name: " << name << "\n";
std::cout << "Age: " << age << "\n";
std::cout << "Is student: " << (is_student ? "Yes" : "No") << "\n";
std::cout << "Skills: ";
for (const auto& skill : skills) {std::cout << skill << " ";
}
std::cout << std::endl;

序列化

json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };
json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };std::string str = Obj.dump(2);
std::cout << str << std::endl;

把 nlohmann::json 类型的对象转换成 JSON 格式的字符串,方便输出、存储或者网络传输 。可以理解成 “序列化” 操作,将内存里的 JSON 对象变成能直接用文本形式处理的字符串。dump 可以带一个整数参数,用于指定缩进的空格数,让生成的 JSON 字符串更易读;不传参数时,生成紧凑的、没有额外空格的 JSON 字符串。 

 

文件读写

// 写入 JSON 到文件
std::ofstream file("data.json");
file << j2.dump(2);
file.close();// 从文件读取 JSON
std::ifstream input("data.json");
json j_from_file;
input >> j_from_file;

 

json常用于c++开发中数据处理、通信、配置、调试等环节,nlohmann/json 等库让 C++ 处理 JSON 便捷高效,结合场景灵活运用,能提升程序的可维护性、扩展性与跨平台协作能力。

🌱🌱🌱.

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

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

相关文章

定制开发开源AI智能名片与S2B2C商城小程序的内容分发体系构建:基于“1+N“素材复用模型的创新实践

摘要&#xff1a;在数字内容爆炸式增长的当下&#xff0c;本文针对内容分发效率低下的行业痛点&#xff0c;提出基于"定制开发开源AI智能名片S2B2C商城小程序"的一体化解决方案。通过构建"1篇长文10条长视频20条短视频10个平台"的素材复用公式&#xff0c;…

c++26新功能—hive容器

一、容器的演进 科学进步的过程一般来说都是从先解决常用的、迫切的问题开始&#xff0c;然后再逐步解决一些少见不迫切的问题&#xff0c;直到最终解决到认知程度内的诸多问题。举一个网上的例子&#xff0c;以前说咱们无法生产水笔的尖头上的钢球&#xff0c;其实这对于国内…

Kafka 源码剖析:消息存储与协议实现(二)

四、协议实现机制探秘 4.1 生产者协议 4.1.1 消息发送流程 Producer 在向 Kafka 集群发送消息时&#xff0c;首先会根据分区策略选择目标分区 。常见的分区策略有轮询、按消息键的哈希值分区以及自定义分区策略 。如果生产者在发送消息时指定了分区号&#xff0c;那么消息就…

Vue.js 与 TypeScript:最佳实践

1. 引言 Vue.js 是一个渐进式、灵活的 JavaScript 框架&#xff0c;广泛用于构建用户界面和单页应用&#xff08;SPA&#xff09;。而 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型和其他高级特性。将两者结合使用&#xff0c;可以帮助开发者构建更具可维护…

webpack5 css-loader:从基础到原理

webpack 处理样式 webpack本身是不能识别样式资源的&#xff0c;需要借助Loader来帮助webpack解析样式资源&#xff0c;样式资源包括但不限于css/less/sass/scss/styl 未使用样式处理加载器前 运行webpack打包命令 bash npx webpack报错信息如图&#xff0c;提示无法识别css…

【GESP】C++三级练习 luogu-B2096 直方图

GESP C三级练习&#xff0c;一维数组练习&#xff0c;难度★★☆☆☆。 题目题解详见&#xff1a;【GESP】C三级练习 luogu-B2096 直方图 | https://www.coderli.com/gesp-3-luogu-b2096/ 【GESP】C三级练习 luogu-B2096 直方图 | OneCoderGESP C三级练习&#xff0c;一维数组…

【网站内容安全检测】之2:从网站所有URL页面中提取所有外部及内部域名信息

还没写成Go的&#xff0c;用Python吧&#xff0c;稍微慢一点 依赖内容&#xff08;安装命令pip install -r requirements.txt) requirements.txt aiohttp beautifulsoup44.12.2 tqdm4.66.1 redis5.2.1 motor3.3.1 pymongo4.6.0 chardet提取域名的程序 domain_extractor.py …

【LLaMA-Factory 实战系列】四、API 篇 - 部署推理服务与批量调用实战

【LLaMA-Factory 实战系列】四、API 篇 - 部署推理服务与批量调用实战 1. 引言2. 推理后端的选择与对比3. 部署 API 推理服务3.1 创建 API 配置文件3.2 启动 API 服务3.3 探索交互式 API 文档 4. 编写 Python 脚本进行批量调用4.1 准备工作4.2 批量调用脚本4.3 运行脚本并查看结…

C++工厂模式的作用(工厂方法、Factory Method、Factory Pattern)

文章目录 代码示例工厂的作用1. 对象创建的封装 &#x1f3ed;2. 解耦客户端和具体类 &#x1f517;3. 统一的创建入口 &#x1f6aa;4. 隐藏实现细节 &#x1f3ad; 在这个项目中的具体体现总结 代码示例 https://gitee.com/arnold_s/my-learning-test/tree/master/20250610_…

9-C#修改任务管理的名称

C#修改任务管理的名称

Fisco Bcos学习 - 搭建第一个区块链网络

文章目录 一、前言二、环境准备三、安装依赖在 macOS 上安装依赖在 Ubuntu 上安装依赖在 CentOS 上安装依赖 四、创建操作目录并下载安装脚本五、搭建单群组 4 节点联盟链六、启动 FISCO BCOS 链七、检查进程八、检查日志输出 在数字化时代&#xff0c;区块链技术正逐渐成为推动…

可视化图解算法53:表达式求值

牛客网 面试笔试 TOP 101 1. 题目 描述 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 数据范围&#xff1a;0≤∣s∣≤100&#xff0c;保证计算结果始终在整型范围内 要求&#xff1a;空间复杂度&#xff1a; O(n)&#xff0c;时间复杂度 O(n) 示例1 输入…

小白成长之路-Nginx配置(二)

文章目录 一、localtion配置1.匹配规则2.匹配优先级3.配置案例 二、rewrite1、 语法2、 可写入字段3 配置案例4 if 指令5.sutoindex6. nginx配置中的常用变量 三、配置Nginx状态统计1.下载vts模块2.编译nginx 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

Qt的第一个程序

Qt的第一个程序 1.hello world2.使用图形化拖拽方式3.使用C代码的方式3.1.头文件3.2.setText3.3.对象树 4.设计MyLabel5.乱码问题 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff…

图书数据接口

基本说明&#xff1a; 接口地址&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn{isbn}&appKey{appkey}返回格式&#xff1a;json请求方式&#xff1a;get请求示例&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn9787513159074&appKey…

MongoDB原理

目录 一、概念 二、架构 2.1 逻辑结构 2.2 数据模型 2.3 存储引擎&#xff1a;WiredTiger 三、事务 一、概念 MongoDB是文档数据库&#xff0c;基本存储单元是 文档&#xff08;Document&#xff09;&#xff0c;以BSON格式&#xff08;一种类json的二进制形式&#xff…

《解码音频:从基础到未来的听觉探索》

音频&#xff1a;开启声音世界的大门 在生活的每一个角落&#xff0c;音频如影随形&#xff0c;编织出丰富多彩的听觉体验。清晨&#xff0c;第一缕阳光尚未完全照进房间&#xff0c;手机里温柔的闹钟铃声&#xff0c;将我们从睡梦中轻轻唤醒&#xff0c;开启活力满满的一天。通…

web安全之h2注入系统学习

起初是在N1 Junior 2025 上面碰到一题&#xff0c;考点是h2的sql注入。由于之前没有见过&#xff0c;趁此机会系统学习一番 实验代码 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS认证系列:考点解析 - cloud trail,cloud watch,aws config

&#x1f3af;一句话总览&#xff1a; 服务名类比/角色主要功能CloudTrail监控摄像头录像回放记录“谁在什么时候做了什么操作”CloudWatch护士测体温 护士喊医生实时监控系统状态&#xff0c;并能报警/自动应对AWS Config保安巡逻 记录资产变更历史记录 AWS 资源的“配置状…

Java八股文——数据结构「数据结构篇」

了解哪些数据结构&#xff1f; 面试官您好&#xff0c;我了解并使用过多种数据结构。在我的理解中&#xff0c;数据结构可以分为几个大的类别&#xff0c;每一类都有其独特的优势和适用场景。 1. 线性结构 (Linear Structures) 这类结构的特点是数据元素之间存在一对一的线性…