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

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...