《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写

news2024/9/24 19:24:16

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库下载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring之国际化:i18n

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

业务模式画布(Business Model Canvas)

本来应该进步了解业务架构和业务分析的知识&#xff0c;可是突然发现一个问题&#xff0c;就是在这透彻这两个概念之前&#xff0c;需要一个更为清晰的概念基础&#xff0c;那就是Business Model&#xff0c;很多时候翻译未商业模式&#xff0c;我更喜欢称之为业务模式&#xf…

SpringMVC之跨域请求

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringMVC之跨域请求 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是同源策略…

将mapper.xml保存为idea的文件模板

将mapper.xml保存为idea的文件模板 在idea的File and Code Templates中将需要使用模板的内容添加为模板文件。 那么接下来请看图&#xff0c;跟着步骤操作吧。 mapper.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper P…

漏洞复现-红帆OA iorepsavexml.aspx文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Rust中saturating_sub的使用

为了防止整数溢出&#xff0c;开发人员通常使用checked_add、checked_sub、saturating_add、saturating_sub等函数&#xff0c;而不是简单的加法和减法&#xff08;、-&#xff09; 关于饱和减法 saturating 是 使饱和之意 饱和减法&#xff08;Saturating Subtraction&#xf…

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

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

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

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

【【IIC模块Verilog实现---用IIC协议从FPGA端读取E2PROM】】

IIC模块Verilog实现–用IIC协议从FPGA端读取E2PROM 下面是 design 设计 I2C_dri.v module IIC_CONTROL #(parameter SLAVE_ADDR 7b1010000 , // E2PROM 从机地址parameter CLK_FREQ 26d50_000_000 , // 50MHz 的时钟频率parameter …

怎么卸载macOS上的爱思助手如何卸载macOS上的logitech g hub,如何卸载顽固macOS应用

1.在App Store里下载Cleaner One Pro &#xff08;注意&#xff0c;不需要订阅付费&#xff01;&#xff01;&#xff01;白嫖基础功能就完全够了&#xff01;&#xff01;&#xff01;&#xff09; 2.运行软件&#xff0c;在左侧目录中选择“应用程序管理”&#xff0c;然后点…

迪文屏开发保姆级教程6----触摸实现界面切换

这篇文章要讲啥事呢&#xff1f; 本篇文章主要介绍了在DGBUS平台上触摸实现界面切换的方法。 文哥悄悄话&#xff1a; 官方开发指南PDF&#xff1a;&#xff08;不方便下载的私聊我发给你&#xff09; https://download.csdn.net/download/qq_21370051/88647174?spm1001.201…

vue场景 无分页列表条件过滤,子组件多选来自父组件的列表

日常开发中&#xff0c;经常会遇到下面场景&#xff1a; 页面加载一个无分页列表&#xff0c;同时工具栏设置多个条件可对列表过滤的场景(典型的就是关键字模糊查询)父组件传给子组件列表&#xff0c;子组件中需要多选列表多选&#xff0c;选择结果返回父组件 1 无分页列表过…

JavaScript常用技巧专题五

文章目录 一、使用适当的命名和注释来提高代码可读性二、优雅的写条件判断代码2.1、普通的if else2.2、三元运算符2.3、多个if else2.4、switch case2.5、对象写法2.6、Map写法 三、封装条件语句四、函数应该只做一件事五、Object.assign给默认对象赋默认值六、函数参数两个以下…

python(上半部分)

第一部分 1、input()语句默认结果是字符串 2、type()可以判断变量的类型 3、input()输出语句 &#xff08;默认为字符串类型&#xff09; 4、命名规则&#xff1a;中文、英文、数字、_&#xff0c;数字不可开头&#xff0c;大小写敏感。 5、 %s&#xff1a;将内容转换成…

2024年手把手教你安装FL Studio Producer Edition 21.2.2.3914中文汉化破解版

FL Studio Producer Edition 21.2.2.3914中文汉化破解版也就是 Image-Line 出品的一款功能强大的编曲软件&#xff0c;全名 Fruity Loops Studio 简称“FL Studio”今天突然的发现我们经常使用的水果音乐制作软件 FL STUDIO 居然从FL STUDIO 21.1.1 一下子跨越了版本号到了FL S…

Typora Mac激活

首先去官网选择mac版本下载安装 typora下载 然后打开typora包内容找到 /Applications/Typora.app/Contents/Resources/TypeMark/page-dist 找到/static/js/Licen..如下图 编辑器打开上面文件夹 输入 hasActivated"true"e.hasActivated 进行搜索 将它改为 hasA…

Typora图床搭建PicGo+阿里云OSS(免费白嫖)

文章目录 1. 目的2. 方案2.1 Typora2.2 PicGo2.3 阿里云OSS 3. 开始配置3.1 获取KeyId和KeySecret3.2 创建Bucket3.3 配置PicGo3.4 配置Typora 4. 成功结束 1. 目的 本地使用Typora编写markdown文档的时候&#xff0c;文档中的图片路径是本地的。这个时候如果需要将该markdown…

TDengine 创始人陶建辉受邀参与 TOP100Summit,发表工程师文化主题演讲

在 AGI 时代&#xff0c;数字化成为组织形态的重要特征&#xff0c;它可以帮助组织实现上下一致的目标和信息的高频传递&#xff0c;从而实现战略目标的协同和敏捷进化。在这样的大背景下&#xff0c;开发者们面临的实际挑战是如何避免技术和业务之间的割裂。 12 月 14-17 日&…

革新搜索从健康场景开始 夸克App全面升级健康搜索体验

大模型时代&#xff0c;夸克率先迈出了革新搜索的第一步。12月25日&#xff0c;夸克App宣布全面升级健康搜索&#xff0c;推出健康大模型应用“夸克健康助手”&#xff0c;并在部分搜索结果和功能板块中上线全新的内容交互方式。升级后&#xff0c;用户在夸克中搜索健康信息的正…

05|提示工程(下):用思维链和思维树提升模型思考质量 ## 什么是 Chain of Thought

05&#xff5c;提示工程&#xff08;下&#xff09;&#xff1a;用思维链和思维树提升模型思考质量 什么是 Chain of Thought CoT 这个概念来源于学术界&#xff0c;是谷歌大脑的 Jason Wei 等人于 2022 年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large La…