《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写
json.hpp库放在文章末尾
1、遍历json文件读写
(1)插入新键值对到json之情形1
原来json文件如下所示:
{"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "DataBaseNumber":7,"hardWare":{"Axis1_offset_Enable": "0.0","Axis1_offset_Stop": "0.1","Axis1_offset_Speed": "2.0","Axis1_offset_Mov": "4.0","Axis1_offset_Pos": "6.0","Axis1_offset_Busy": "8.1","Axis2_offset_Enable": "10.0","Axis2_offset_Stop": "10.1","Axis2_offset_Speed": "12.0","Axis2_offset_Mov": "14.0","Axis2_offset_Pos": "16.0","Axis2_offset_Busy": "18.1"}
}
现想要在末尾插入新的键值对如下:
{"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "DataBaseNumber":7,"hardWare":{"Axis1_offset_Enable": "0.0","Axis1_offset_Stop": "0.1","Axis1_offset_Speed": "2.0","Axis1_offset_Mov": "4.0","Axis1_offset_Pos": "6.0","Axis1_offset_Busy": "8.1","Axis2_offset_Enable": "10.0","Axis2_offset_Stop": "10.1","Axis2_offset_Speed": "12.0","Axis2_offset_Mov": "14.0","Axis2_offset_Pos": "16.0","Axis2_offset_Busy": "18.1"},"time":{"maxtime":100,"mintime":0}
}
代码实现:
#include <iostream>
#include <fstream>
#include "json.hpp"using json = nlohmann::json;int main() {std::ifstream file("test.json");if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}json jsonData;file >> jsonData;file.close();// 创建新的键值对json timeData = {{"maxtime", 100},{"mintime", 0}};// 将新的键值对插入到现有的 JSON 数据中jsonData["time"] = timeData;// 将更新后的 JSON 数据写入文件std::ofstream outputFile("test.json");if (!outputFile.is_open()) {std::cerr << "Failed to open file for writing." << std::endl;return 1;}outputFile << std::setw(4) << jsonData << std::endl; // 美化输出,每个元素缩进四个空格outputFile.close();return 0;
}
(2)插入新键值对到json之情形2
原来的json文件如下:
{"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "DataBaseNumber":7,"hardWare":{"Axis1_offset_Enable": "0.0","Axis1_offset_Stop": "0.1","Axis1_offset_Speed": "2.0","Axis1_offset_Mov": "4.0","Axis1_offset_Pos": "6.0","Axis1_offset_Busy": "8.1","Axis2_offset_Enable": "10.0","Axis2_offset_Stop": "10.1","Axis2_offset_Speed": "12.0","Axis2_offset_Mov": "14.0","Axis2_offset_Pos": "16.0","Axis2_offset_Busy": "18.1"}
}
现想要在末尾插入一个数组,如下所示:
{"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "DataBaseNumber":7,"hardWare":{"Axis1_offset_Enable": "0.0","Axis1_offset_Stop": "0.1","Axis1_offset_Speed": "2.0","Axis1_offset_Mov": "4.0","Axis1_offset_Pos": "6.0","Axis1_offset_Busy": "8.1","Axis2_offset_Enable": "10.0","Axis2_offset_Stop": "10.1","Axis2_offset_Speed": "12.0","Axis2_offset_Mov": "14.0","Axis2_offset_Pos": "16.0","Axis2_offset_Busy": "18.1"},"ROIS":[{"Name":"ROI1","weight":1},{"Name":"ROI2","weight":0.5}]
}
代码实现:
#include <iostream>
#include <fstream>
#include "json.hpp"using json = nlohmann::json;int main() {std::ifstream file("your_file.json");if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}json jsonData;file >> jsonData;file.close();// 创建新的 ROIS 数据json roisData = {{"Name", "ROI1"},{"weight", 1}};json roisData2 = {{"Name", "ROI2"},{"weight", 0.5}};// 将新的 ROIS 数据插入到 JSON 数据末尾jsonData["ROIS"].push_back(roisData);jsonData["ROIS"].push_back(roisData2);// 将更新后的 JSON 数据写入文件std::ofstream outputFile("updated_file.json");if (!outputFile.is_open()) {std::cerr << "Failed to open file for writing." << std::endl;return 1;}outputFile << std::setw(4) << jsonData << std::endl; // 美化输出,每个元素缩进四个空格outputFile.close();return 0;
}
(3)插入新键值对到json之情形3
原先的json文件如下:
{"test": [{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1}]},"Index": 1},{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1}]},"Index": 2}]
}
现想要在数组的两个内容里面index和weight下面插入新的键值对,如下所示:
{"test": [{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1,"width": 100}]},"Index": 1,"name": "vimba"},{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1,"width": 100}]},"Index": 2,"name": "vimba"}]
}
代码实现:
#include <iostream>
#include <fstream>
#include "json.hpp"using json = nlohmann::json;int main() {std::ifstream file("your_file.json");if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}json jsonData;file >> jsonData;file.close();// 遍历 AutoExposure 数组if (jsonData.find("test") != jsonData.end() && jsonData["test"].is_array()) {for (auto& entry : jsonData["test"]) {// 获取 ROIS 数组if (entry.find("IsUseROIs") != entry.end() && entry["IsUseROIs"].find("ROIS") != entry["IsUseROIs"].end()) {// 在每个 ROIS 数组元素后插入新键值对 "width": 100for (auto& rois_entry : entry["IsUseROIs"]["ROIS"]) {rois_entry["width"] = 100;}}// 在每个对象中添加新键值对 "name": "vimba"entry["name"] = "vimba";}}// 将更新后的 JSON 数据写入文件std::ofstream outputFile("updated_file.json");if (!outputFile.is_open()) {std::cerr << "Failed to open file for writing." << std::endl;return 1;}outputFile << std::setw(4) << jsonData << std::endl; // 美化输出,每个元素缩进四个空格outputFile.close();return 0;
}
(4)修改原先的键值对之情形1
原先的json文件如下:
{"test": [{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1}]},"Index": 1},{"FixedParameters": {"bit_depth": 255,"dynamic_range": 0.8},"IsUseROIs":{"isUseROIs":false,"ROIS":[{"Name":"ROI1","weight":1}]},"Index": 2}]
}
现想修改每个数组元素里面index和weight值,代码如下:
#include <iostream>
#include <fstream>
#include "json.hpp"using json = nlohmann::json;int main() {std::ifstream file("your_file.json");if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}json jsonData;file >> jsonData;file.close();// 遍历 AutoExposure 数组if (jsonData.find("test") != jsonData.end() && jsonData["test"].is_array()) {for (auto& entry : jsonData["test"]) {// 修改每个对象的 "Index" 值为 10 和 20entry["Index"] = (entry["Index"] == 1) ? 10 : 20; //这里可以通过json其他键值对判断目前遍历的是数组第几个元素// 修改每个对象的 "weight" 值为 0.5 和 0.7if (entry.find("IsUseROIs") != entry.end() && entry["IsUseROIs"].find("ROIS") != entry["IsUseROIs"].end()) {for (auto& rois_entry : entry["IsUseROIs"]["ROIS"]) {rois_entry["weight"] = (rois_entry["weight"] == 1) ? 0.5 : 0.7; //这里可以通过json其他键值对判断目前遍历的是数组第几个元素} }}}// 将更新后的 JSON 数据写入文件std::ofstream outputFile("updated_file.json");if (!outputFile.is_open()) {std::cerr << "Failed to open file for writing." << std::endl;return 1;}outputFile << std::setw(4) << jsonData << std::endl; // 美化输出,每个元素缩进四个空格outputFile.close();return 0;
}
(5)修改原先的键值对之情形2
原先的json文件如下:
{"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "DataBaseNumber":7,"hardWare":{"Axis1_offset_Enable": "0.0","Axis1_offset_Stop": "0.1","Axis1_offset_Speed": "2.0","Axis1_offset_Mov": "4.0","Axis1_offset_Pos": "6.0","Axis1_offset_Busy": "8.1","Axis2_offset_Enable": "10.0","Axis2_offset_Stop": "10.1","Axis2_offset_Speed": "12.0","Axis2_offset_Mov": "14.0","Axis2_offset_Pos": "16.0","Axis2_offset_Busy": "18.1"}
}
现想修改修改Axis2_offset_Busy为18.2,代码如下:
#include <iostream>
#include <fstream>
#include "json.hpp"using json = nlohmann::json;int main() {std::ifstream file("your_file.json");if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}json jsonData;file >> jsonData;file.close();// 修改特定键的值if (jsonData.find("hardWare") != jsonData.end()) {jsonData["hardWare"]["Axis2_offset_Busy"] = "18.2";}// 将更新后的 JSON 数据写入文件std::ofstream outputFile("updated_file.json");if (!outputFile.is_open()) {std::cerr << "Failed to open file for writing." << std::endl;return 1;}outputFile << std::setw(4) << jsonData << std::endl; // 美化输出,每个元素缩进四个空格outputFile.close();return 0;
}
json.hpp库下载

相关文章:
《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写
json.hpp库放在文章末尾 1、遍历json文件读写 (1)插入新键值对到json之情形1 原来json文件如下所示: {"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "Data…...
使用 fixture 机制重构 appium_helloworld
一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…...
基于python的excel检查和读写软件
软件版本:python3.6 窗口和界面gui代码: class mygui:def _init_(self):passdef run(self):root Tkinter.Tk()root.title(ExcelRun)max_w, max_h root.maxsize()root.geometry(f500x500{int((max_w - 500) / 2)}{int((max_h - 300) / 2)}) # 居中显示…...
Podman配置mongodb
文章目录 查询镜像拉取镜像查看镜像运行容器创建root用户 查询镜像 podman search mongo拉取镜像 podman pull docker.io/library/mongo查看镜像 podman images运行容器 podman run -d -p 27017:27017 --namemongodb-test docker.io/library/mongo创建root用户 podman exe…...
java实现矩阵谱峰搜索算法
矩阵谱峰搜索算法,也称为矩阵谱峰查找算法,是一种用于搜索二维矩阵中谱峰的方法。谱峰是指在矩阵中的一个元素,它比其上下左右四个相邻元素都大或相等。 该算法的基本思想是从矩阵的中间列开始,找到该列中的最大元素,…...
Jenkins的特殊操作定时自动执行任务以及测试报告调优
java -Dhudson.model.DirectoryBrowserSupport.CSP -jar Jenkins.war 测试报告 不美丽 执行上面的代码 重启jenkins 就好了...
【Grafana】Grafana匿名访问以及与LDAP连接
上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据,但还需要给用户去创建账号允许他们登录后才能看展示得数据,那有什么办法让非管理员更方便得去访问Grafana呢?下面介绍两个比较方便实现的: 在开始设置前ÿ…...
elasticsearch-py 8.x的一些优势
早在 2022 年 2 月,当 Elasticsearch 8.0 发布时,Python 客户端也发布了 8.0 版本。它是对 7.x 客户端的部分重写,并带有许多不错的功能(如下所述),但也带有弃用警告和重大更改。今天,客户端的 7.17 版本仍然相对流行,每月下载量超过 100 万次,占 8.x 下载量的 ~50…...
RK3588平台开发系列讲解(AI 篇)RKNN 数据结构详解
文章目录 一、rknn_sdk_version二、rknn_input_output_num三、rknn_tensor_attr四、rknn_perf_detail五、rknn_perf_run六、rknn_mem_size七、rknn_tensor_mem八、rknn_input九、rknn_output沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN 相关的数…...
2023版本QT学习记录 -6- UDP通信之UDP接收端
———————UDP接收端——————— 🎄动图演示 🎄发送端通信步骤思维导图 🎄添加组件 QT core gui network🎄添加头文件 #include "qudpsocket.h"🎄创建接收对象 QUdpSocket *recvsocket;&…...
C预处理 | pragma详解
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...
轻松搭建知识付费小程序:让知识传播更便捷
明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…...
沉浸式go-cache源码阅读!
大家好,我是豆小匠。 这期来阅读go-cache的源码,了解本地缓存的实现方式,同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件,ca…...
伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei
打开题目 代码审计 第一层绕过 if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,r)."</h1></br>"; 要求我们get传参的text内容必须为w…...
性能优化之资源优化
性能优化之资源优化 资源优化性能关键检测流程。浅析一下基于Unity3D 美术规则约束一、模型层面二、贴图层面三、动画层面四、声音层面:(音频通用设置)五、UI层面: 题外点:诚然在优化中,美术占比是很重要的…...
ChatGPT免费 | 8个免费使用GPT-4的方法
这篇文章为寻找免费使用GPT-4技术的读者提供了一份实用的指南。 每个推荐的平台都包括了简要的描述和链接,方便读者直接访问。 以下是根据你提供的内容,稍作整理的文章结构: 1. HuggingFace 描述: 提供GPT-4等多种语言模型的平台。 如何使用:…...
解决Qt“报无法定位程序输入点xxx于动态连接库“问题
今天,在使用QtVS2019编译工程时,弹出"无法定位程序输入点xxx于动态链接库"问题,如图(1)所示: 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多: (1) 工程Release/Deb…...
wpf-MVVM绑定时可能出现的内存泄漏问题
文章速览 引言错误示范示例1示例2 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 引言 正确结构: Model <——> ViewModel <——> View 但很多时候,很容易出现…...
【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试
一些有用的常用的命令测试 一、系统信息查询 可以查询板子的内核信息、CPU处理器信息、环境变量等 二、CPU频率 从上面的系统信息查询到,这是一颗具有两个ARMv7结构A7内核的处理器,主频最高1.2GHz 可以通过命令查看当前支持的频率以及目前所使用主频 …...
基于iOS平台的车牌识别表情识别项目
基于iOS平台的车牌识别&&表情识别项目 简介 该项目客户端搭载于iOS平台,服务端搭载于阿里云服务器,主要功能是通过拍照或选取相册图片来进行车牌的识别以及人脸表情识别。本文便是对项目整体流程设计思路和具体实现做一个详细介绍。 整体实…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
