《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": 100
                for (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 和 20
            entry["Index"] = (entry["Index"] == 1) ? 10 : 20;  //这里可以通过json其他键值对判断目前遍历的是数组第几个元素

            // 修改每个对象的 "weight" 值为 0.5 和 0.7
            if (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库下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java注解的作用是什么?】

&#x1f341;Java注解的作用是什么&#xff1f; &#x1f341;典型解析&#x1f341;扩展知识仓&#x1f341;什么是元注解&#x1f341;Retention&#x1f341;Target&#x1f341;Documented&#x1f341;Inherited &#x1f341;典型解析 Java 注解用于为 Java 代码提供元数…

W5500-EVB-Pico评估版介绍

文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同&#xff0c;但…

博客摘录「 Apollo安装和基本使用」2023年11月27日

常见配置中心对比 Spring Cloud Config: https://github.com/spring-cloud/spring-cloud-configApollo: https://github.com/ctripcorp/apolloNacos: https://github.com/alibaba/nacos 对比项目/配置中心 spring cloud config apollo nacos(重点) 开源时间 2014.9 2016…

逻辑运算加法器

前言 逻辑门本质上操作的是单个二进制数&#xff0c;通过高低电压或者有无信号来表示&#xff0c;并且&#xff0c;因为二进制数的原因&#xff0c;一个数字&#xff0c;我们可以通过二进制数来表示&#xff0c;整数可以精确表示&#xff0c;浮点数可以近似表示 本篇文章使用逻…

【前端查漏补缺】每日10题 2023-12-25

1. 实现lodash _get方法 _.get 是 Lodash 库中的一个方法&#xff0c;用于按照给定的路径从对象中获取值。它是一种安全的方式&#xff0c;可以避免在获取嵌套属性时出现的空指针错误。 _.get 方法的语法如下&#xff1a; _.get(object, path, [defaultValue])参数说明&…

python dash call_back 多output 7

效果 代码 # 导入Dash库及其相关组件&#xff0c;用于构建交互式Web应用 from dash import Dash, dcc, html, Input, Output, callback# 定义一个外部样式表&#xff0c;用于美化应用界面 external_stylesheets [https://codepen.io/chriddyp/pen/bWLwgP.css]# 创建一个D…

Jupyter Notebook的安装及在网页端和VScode中使用教程(详细图文教程)

目录 一、Jupyter Notebook1.1 组成组件1.2 优点1.3 常规用途 二、安装及使用2.1 网页端2.1.1 安装Jupyter Notebook2.1.2 检验是否安装成功2.1.3 启动Jupyter Notebook2.1.4 使用Jupyter Notebook 2.2 VScode中安装及使用2.2.1 安装Jupyter2.2.2 使用Jupyter 三、常用命令3.1 …

有没有简单好用的仓库管理系统?

“我是一家小型加工制造企业&#xff0c;希望使用一款免费的仓库管理软件管理下仓库物资&#xff0c;要上手比较快&#xff0c;有各类报表统计功能&#xff01;同时有客服人员可以答疑。PS&#xff1a;最好有配套APP就最方便了。” 稍微总结一下仓库管理系统的需求—— 免费的仓…

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一…

220v电源转换12v和24v用什么芯片

问&#xff1a;将220V电源转换为12V和24V - 使用什么芯片&#xff1f; 答&#xff1a;常用于将220V电源转换为12V和24V的芯片是AH8669和AH8665。 问&#xff1a;AH8669芯片提供了什么特点&#xff1f; 答&#xff1a;AH8669芯片适用于最大电流为700mA的应用。它内置了MOSFET…

Text2SQL学习整理(五)将Text-to-SQL任务与基本语言模型结合

导语 上篇博客&#xff1a;Text2SQL学习整理&#xff08;四&#xff09;将预训练语言模型引入WikiSQL任务简要介绍了两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法&#xff1a;SQLOVA和X-SQL模型。其中&#xff0c;借助预训练语言模型的强大表示能力&#xff0c;S…

maven下载jar包失败

配置国内镜像 设置国内的仓库,比如: <!--阿里仓库--><mirror><id>alimaven</id><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public/</url><mirrorOf>central</mirrorOf></mirror>…

C++11(上):新特性讲解

C11新特性讲解 前言1.列表初始化1.1{ }初始化1.2std::initializer_list 2.类型推导2.1 auto2.2 typeid2.3 decltype 3.范围for4.STL的变化4.1新容器4.2容器的新方法 5.右值引用和移动语义5.1 左值引用和右值引用5.2 左值引用与右值引用比较5.3 右值引用的使用场景5.4 右值、左值…

张驰咨询:企业提质增效的关键:掌握六西格玛设计(DFSS)的核心法则

在当今快节奏、变革迅速的商业世界中&#xff0c;企业面临的最大挑战之一是如何兼顾成本效益与高品质输出。六西格玛设计&#xff08;DFSS&#xff09;方法论不仅响应了这一挑战&#xff0c;而且提供了一个综合解决方案&#xff0c;将顾客需求和企业目标完美融合&#xff0c;并…

汽车行业必须知识--CAN FD通讯

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 前面我们讲了CAN的基础知识&#xff0c;但是由于CAN总线存在通讯速率低&#xff0c;报文头过长&#xff0c…

嵌入式科普(7)你知道JTAGSWD接口最少接几根线?

一、目的/概述 二、实际问题 2.1 原接线方式 2.2 解决方案 2.3 思考GND原因 三、资料来源 四、JTAG&SWD相关概念的逻辑 五、总结和提问 嵌入式科普(7)你知道JTAG&SWD接口最少接几根线&#xff1f; 一、目的/概述 1、那位同学直接抢答说2根线&#xff0c;数…

【网络编程】基于UDP数据报实现回显服务器/客户端程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 前言 我们如果…

2023大数据十大关键词

随着我国大数据产业政策日趋完善、产业基础日益巩固、数据要素市场建设不断深化&#xff0c;大数据产业再次迎来巨大发展空间。6月26日至28日&#xff0c;由中国信息通信研究院、中国通信标准化协会主办&#xff0c;中国通信标准化协会大数据技术标准推进委员会&#xff08;CCS…

中国信通院「星熠」案例公布,个推消息推送获评绿色SDK产品优秀案例

12月22日&#xff0c;由中国信息通信研究院安全研究所主办、大数据应用与安全创新实验室承办的“数据安全共同体计划成员大会&#xff08;2023&#xff09;”在京举行。每日互动&#xff08;个推&#xff09;作为“数据安全共同体计划”的联合发起单位及首批成员单位受邀出席大…

unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、打包到HoloLens二、Vuforia相关1.配置识别框2.制作一个半透明识别框&#xff1a;3.设置如下4.问题 四 HoloLens2 问题总结 前言 我使用的utniy 版本&#xff1a;Unity 2021.3…