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

《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文件读写 &#xff08;1&#xff09;插入新键值对到json之情形1 原来json文件如下所示&#xff1a; {"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检查和读写软件

软件版本&#xff1a;python3.6 窗口和界面gui代码&#xff1a; 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实现矩阵谱峰搜索算法

矩阵谱峰搜索算法&#xff0c;也称为矩阵谱峰查找算法&#xff0c;是一种用于搜索二维矩阵中谱峰的方法。谱峰是指在矩阵中的一个元素&#xff0c;它比其上下左右四个相邻元素都大或相等。 该算法的基本思想是从矩阵的中间列开始&#xff0c;找到该列中的最大元素&#xff0c;…...

Jenkins的特殊操作定时自动执行任务以及测试报告调优

java -Dhudson.model.DirectoryBrowserSupport.CSP -jar Jenkins.war 测试报告 不美丽 执行上面的代码 重启jenkins 就好了...

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据&#xff0c;但还需要给用户去创建账号允许他们登录后才能看展示得数据&#xff0c;那有什么办法让非管理员更方便得去访问Grafana呢&#xff1f;下面介绍两个比较方便实现的&#xff1a; 在开始设置前&#xff…...

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接收端——————— &#x1f384;动图演示 &#x1f384;发送端通信步骤思维导图 &#x1f384;添加组件 QT core gui network&#x1f384;添加头文件 #include "qudpsocket.h"&#x1f384;创建接收对象 QUdpSocket *recvsocket;&…...

C预处理 | pragma详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…...

轻松搭建知识付费小程序:让知识传播更便捷

明理信息科技saas知识付费平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和维护…...

沉浸式go-cache源码阅读!

大家好&#xff0c;我是豆小匠。 这期来阅读go-cache的源码&#xff0c;了解本地缓存的实现方式&#xff0c;同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件&#xff0c;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 美术规则约束一、模型层面二、贴图层面三、动画层面四、声音层面&#xff1a;&#xff08;音频通用设置&#xff09;五、UI层面&#xff1a; 题外点&#xff1a;诚然在优化中&#xff0c;美术占比是很重要的…...

ChatGPT免费 | 8个免费使用GPT-4的方法

这篇文章为寻找免费使用GPT-4技术的读者提供了一份实用的指南。 每个推荐的平台都包括了简要的描述和链接&#xff0c;方便读者直接访问。 以下是根据你提供的内容&#xff0c;稍作整理的文章结构&#xff1a; 1. HuggingFace 描述: 提供GPT-4等多种语言模型的平台。 如何使用:…...

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天&#xff0c;在使用QtVS2019编译工程时&#xff0c;弹出"无法定位程序输入点xxx于动态链接库"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多&#xff1a; (1) 工程Release/Deb…...

wpf-MVVM绑定时可能出现的内存泄漏问题

文章速览 引言错误示范示例1示例2 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 引言 正确结构&#xff1a; Model <——> ViewModel <——> View 但很多时候&#xff0c;很容易出现…...

【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试

一些有用的常用的命令测试 一、系统信息查询 可以查询板子的内核信息、CPU处理器信息、环境变量等 二、CPU频率 从上面的系统信息查询到&#xff0c;这是一颗具有两个ARMv7结构A7内核的处理器&#xff0c;主频最高1.2GHz 可以通过命令查看当前支持的频率以及目前所使用主频 …...

基于iOS平台的车牌识别表情识别项目

基于iOS平台的车牌识别&&表情识别项目 简介 ​ 该项目客户端搭载于iOS平台&#xff0c;服务端搭载于阿里云服务器&#xff0c;主要功能是通过拍照或选取相册图片来进行车牌的识别以及人脸表情识别。本文便是对项目整体流程设计思路和具体实现做一个详细介绍。 整体实…...

5个关键场景下如何选择DINOv2模型:从ViT-S到ViT-G的完整指南

5个关键场景下如何选择DINOv2模型&#xff1a;从ViT-S到ViT-G的完整指南 【免费下载链接】dinov2 PyTorch code and models for the DINOv2 self-supervised learning method. 项目地址: https://gitcode.com/GitHub_Trending/di/dinov2 DINOv2是Meta AI Research开发的…...

告别窄带!用ADS仿真带你搞懂Doherty放大器带宽瓶颈与三种宽带方案

突破Doherty放大器带宽限制&#xff1a;ADS仿真实战与三大宽带方案解析 在射频功率放大器设计中&#xff0c;Doherty结构因其高效率特性成为5G基站和现代通信系统的核心组件。然而传统设计面临严峻的带宽挑战——当信号频率偏离中心频点时&#xff0c;效率可能骤降30%以上。本文…...

C#调用打印机老是失败?先别怪代码,这5个Windows驱动设置坑你踩过几个?

C#调用打印机故障排查指南&#xff1a;5个被忽视的Windows驱动陷阱 当你信心满满地写完C#打印代码&#xff0c;点击"打印"按钮后却只收获了一片寂静——打印机毫无反应&#xff0c;控制台也没有任何错误提示。这种挫败感每个C#开发者都经历过。但先别急着重写代码&am…...

Acton工厂模式:批量部署智能合约的终极技术指南

Acton工厂模式&#xff1a;批量部署智能合约的终极技术指南 【免费下载链接】acton Toolchain for TON smart contract development and beyond 项目地址: https://gitcode.com/GitHub_Trending/acto/acton Acton作为TON区块链智能合约开发的完整工具链&#xff0c;为开…...

如何快速上手PCL点云库:10个核心模块详解与实践

如何快速上手PCL点云库&#xff1a;10个核心模块详解与实践 【免费下载链接】pcl-learning &#x1f525;PCL&#xff08;Point Cloud Library&#xff09;点云库学习记录 项目地址: https://gitcode.com/gh_mirrors/pc/pcl-learning PCL&#xff08;Point Cloud Librar…...

Windows Cleaner:解决C盘爆红问题的3个高效方法

Windows Cleaner&#xff1a;解决C盘爆红问题的3个高效方法 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当您的Windows电脑C盘突然变红&#xff0c;可用空间告…...

Python自动化签到脚本dailycheckin:Docker部署与模块化设计详解

1. 项目概述与核心价值最近在折腾一些自动化工具&#xff0c;发现一个挺有意思的项目&#xff0c;叫Sitoi/dailycheckin。简单来说&#xff0c;这是一个用 Python 写的签到脚本集合&#xff0c;能帮你自动完成各种网站和应用的日常签到任务。你可能觉得签到不就是点一下吗&…...

DeepSeek Chat功能测试实战手册:5步完成生产级对话模型验收(附测试用例模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek Chat功能测试实战手册&#xff1a;5步完成生产级对话模型验收&#xff08;附测试用例模板&#xff09; DeepSeek Chat 作为开源大语言模型对话接口&#xff0c;其生产就绪性需通过结构化、可…...

别再手动调样式了!用Qgis的表达式功能,5分钟搞定百强县预算地图的智能标注

用Qgis表达式解锁地图智能标注&#xff1a;5分钟打造专业级百强县预算可视化 当面对包含数百个县域的预算数据时&#xff0c;传统手动标注不仅效率低下&#xff0c;更难以实现数据与视觉的智能联动。Qgis的表达式功能如同一把瑞士军刀&#xff0c;能精准切割数据展示的复杂度。…...

企业微信集成ChatGPT:开源中间件部署与AI助手实战指南

1. 项目概述&#xff1a;一个让企业微信也能“听懂”ChatGPT的桥梁 如果你在企业里负责技术或者运维&#xff0c;大概率会有一个企业微信群&#xff0c;用来接收服务器告警、处理工单或者进行团队协作。当ChatGPT横空出世&#xff0c;展示出强大的对话和问题解决能力时&#x…...