当前位置: 首页 > 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;主要功能是通过拍照或选取相册图片来进行车牌的识别以及人脸表情识别。本文便是对项目整体流程设计思路和具体实现做一个详细介绍。 整体实…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...