《C++避坑神器·二十四》简单搞懂json文件的读写之根据键值对读写Json

news2024/9/24 5:32:49

c++11 json解析库nlohmann/json.hpp文件整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。

json.hpp库在文章末尾下载

读写主要有两种方式,第一种根据键值对读写,第二种直接遍历json文件读写。

1、根据键值对读写
假设有个json文件,格式如下:

{
  "test": [
    {
      "FixedParameters": {
		"bit_depth": 10,
        "dark_level": 5.5,
        "dark_time": 100,
        "dynamic_range": 0.1
      },
	  "InitialParameters":{
		"InitialTime":20,
		"rate":50
	  },
	  "JudgmentMechanism":{
		"max_time": 100000,
		"min_time": 0,
		"rangeMax": 0.9,
		"rangeMin": 0.3,
		"targetMax": 0.9,
		"targetMin": 0.5
	  },
	  "IterationStepLength":{
		"belowNormalRange":1.5,
		"aboveNormalRange":2,
		"totalIterations":10
	  },
	  "IsUseROIs":{
		"isUseROIs":false,
		"isCalculateEntireROIGray":false,
		"pixelTotalNumber":1000,
		"isUseWeightedAverage":false,
		"ROIS":[
		  {
			"Name":"ROI1",
			"weight":1,
			"x":0,
			"y":0,
			"width":100,
			"height":100
		  }
		]
	  },
      "Index": 1,
      "Name": "data1",
	  "SerialNumber": "0000000000"
    },
    {
      "FixedParameters": {
		"bit_depth": 200,
        "dark_level": 10.0,
        "dark_time": 3000,
        "dynamic_range": 0.5
      },
	  "InitialParameters":{
		"InitialTime":0,
		"rate":20
	  },
	  "JudgmentMechanism":{
		"max_time": 200000,
		"min_time": 11111,
		"rangeMax": 0.9,
		"rangeMin": 0.3,
		"targetMax": 0.9,
		"targetMin": 0.5
	  },
	  "IterationStepLength":{
		"belowNormalRange":1.5,
		"aboveNormalRange":2,
		"totalIterations":10
	  },
	  "IsUseROIs":{
		"isUseROIs":false,
		"isCalculateEntireROIGray":false,
		"pixelTotalNumber":1000,
		"isUseWeightedAverage":false,
		"ROIS":[
		  {
			"Name":"ROI1",
			"weight":1,
			"x":0,
			"y":0,
			"width":100,
			"height":200
		  }
		]
	  },
      "Index": 2,
      "Name": "data2",
	  "SerialNumber": "1111111111"
    }
  ]
}

读json文件:

头文件的部分内容

#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <mutex>
#include "json.hpp"
using namespace std;
using json = nlohmann::ordered_json;

struct FixedParameters_
{
    int bit_depth;
    double dark_level;
    double dark_time;
    double dynamic_range;
};

struct InitialParameters_
{
    int InitialTime;
    bool isAutoUpdateInitTime;
    bool isAutoUpdateMaxMinTime;
    int rate;
};

struct JudgmentMechanism_
{
    int max_time;
    int min_time;
    double rangeMax;
    double rangeMin;
    double target_max;
    double target_min;
};

struct IterationStepLength_
{
    double belowNormalRange;
    double aboveNormalRange;
    int totalIterations;
};

struct ROIS
{
    double weight;
    int x;
    int y;
    int width;
    int height;
};

struct IsUseROIs_
{
    bool isUseROIs;
    bool isCalculateEntireROIGray;
    int pixelTotalNumber;
    bool isUseWeightedAverage;
    std::map<std::string, ROIS> rois;
};

struct Param
{
    FixedParameters_ fixedParameters;
    InitialParameters_ initialParameters;
    JudgmentMechanism_ judgmentMechanism;
    IterationStepLength_ iterationStepLength;
    IsUseROIs_ isUseROIs;
    std::string SN;
};

struct AEConfig
{
    std::map<std::string, Param> AE_Config;
};

class ReadWriteConfig
{
public:
    static ReadWriteConfig *getinstance();
    ReadWriteConfig();

    //read/write json
    AEConfig ReadAEConfig(string configPath);
    void WriteAEConfig(AEConfig AE_Config, string configPath);

private:
    static ReadWriteConfig *m_ReadWriteConfig;
    string path;
    json m_JsonConfig;
};

CPP部分

AEConfig ReadWriteConfig::ReadAEConfig(string configPath)
{
    m_mutex.lock();
    if (configPath != "")
        path = configPath;
    std::ifstream ifs(path, std::fstream::in);
    if (ifs.fail())
    {
        //return 0;
        m_mutex.unlock();
        throw std::runtime_error("Unable to open AEConfig File.");
    }
    ifs >> m_JsonConfig;
    ifs.close();

    AEConfig AE_Config;

    auto AEConfig = m_JsonConfig["test"];
    for (auto& it : AEConfig.items())
    {
        string cameraName = it.value()["Name"].get<string>();
        AE_Config.AE_Config[cameraName].SN = it.value()["SerialNumber"].get<string>();
        AE_Config.AE_Config[cameraName].fixedParameters.bit_depth = it.value()["FixedParameters"]["bit_depth"].get<int>();
        AE_Config.AE_Config[cameraName].fixedParameters.dark_level = it.value()["FixedParameters"]["dark_level"].get<double>();
        AE_Config.AE_Config[cameraName].fixedParameters.dark_time = it.value()["FixedParameters"]["dark_time"].get<double>();
        AE_Config.AE_Config[cameraName].fixedParameters.dynamic_range = it.value()["FixedParameters"]["dynamic_range"].get<double>();

        AE_Config.AE_Config[cameraName].initialParameters.InitialTime = it.value()["InitialParameters"]["InitialTime"].get<int>();
        AE_Config.AE_Config[cameraName].initialParameters.isAutoUpdateInitTime = it.value()["InitialParameters"]["isAutoUpdateInitTime"].get<bool>();
        AE_Config.AE_Config[cameraName].initialParameters.isAutoUpdateMaxMinTime = it.value()["InitialParameters"]["isAutoUpdateMaxMinTime"].get<bool>();
        AE_Config.AE_Config[cameraName].initialParameters.rate = it.value()["InitialParameters"]["rate"].get<int>();

        AE_Config.AE_Config[cameraName].judgmentMechanism.max_time = it.value()["JudgmentMechanism"]["max_time"].get<int>();
        AE_Config.AE_Config[cameraName].judgmentMechanism.min_time = it.value()["JudgmentMechanism"]["min_time"].get<int>();
        AE_Config.AE_Config[cameraName].judgmentMechanism.rangeMax = it.value()["JudgmentMechanism"]["rangeMax"].get<double>();
        AE_Config.AE_Config[cameraName].judgmentMechanism.rangeMin = it.value()["JudgmentMechanism"]["rangeMin"].get<double>();
        AE_Config.AE_Config[cameraName].judgmentMechanism.target_max = it.value()["JudgmentMechanism"]["targetMax"].get<double>();
        AE_Config.AE_Config[cameraName].judgmentMechanism.target_min = it.value()["JudgmentMechanism"]["targetMin"].get<double>();

        AE_Config.AE_Config[cameraName].iterationStepLength.belowNormalRange = it.value()["IterationStepLength"]["belowNormalRange"].get<double>();
        AE_Config.AE_Config[cameraName].iterationStepLength.aboveNormalRange = it.value()["IterationStepLength"]["aboveNormalRange"].get<double>();
        AE_Config.AE_Config[cameraName].iterationStepLength.totalIterations = it.value()["IterationStepLength"]["totalIterations"].get<int>();

        AE_Config.AE_Config[cameraName].isUseROIs.isUseROIs = it.value()["IsUseROIs"]["isUseROIs"].get<bool>();
        AE_Config.AE_Config[cameraName].isUseROIs.isCalculateEntireROIGray = it.value()["IsUseROIs"]["isCalculateEntireROIGray"].get<bool>();
        AE_Config.AE_Config[cameraName].isUseROIs.pixelTotalNumber = it.value()["IsUseROIs"]["pixelTotalNumber"].get<int>();
        AE_Config.AE_Config[cameraName].isUseROIs.isUseWeightedAverage = it.value()["IsUseROIs"]["isUseWeightedAverage"].get<bool>();
        auto roiConfig = it.value()["IsUseROIs"]["ROIS"];
        for (auto& it : roiConfig.items())
        {
            string roiName = it.value()["Name"].get<string>();
            ROIS rois;
            rois.weight = it.value()["weight"].get<double>();
            rois.x = it.value()["x"].get<int>();
            rois.y = it.value()["y"].get<int>();
            rois.width = it.value()["width"].get<int>();
            rois.height = it.value()["height"].get<int>();
            AE_Config.AE_Config[cameraName].isUseROIs.rois[roiName] = rois;
        }
    }

    m_mutex.unlock();
    return AE_Config;
}

写json文件

void ReadWriteConfig::WriteAEConfig(AEConfig AE_Config, string configPath)
{
    m_mutex.lock();

    if (configPath != "")
        path = configPath;

    m_JsonConfig["test"].clear();
    for (auto gt = AE_Config.AE_Config.begin(); gt != AE_Config.AE_Config.end(); gt++)
    {
        json AutoExposure;
        AutoExposure["Name"] = gt->first;
        AutoExposure["SerialNumber"] = gt->second.SN;

        AutoExposure["FixedParameters"]["bit_depth"] = gt->second.fixedParameters.bit_depth;
        AutoExposure["FixedParameters"]["dark_level"] = gt->second.fixedParameters.dark_level;
        AutoExposure["FixedParameters"]["dark_time"] = gt->second.fixedParameters.dark_time;
        AutoExposure["FixedParameters"]["dynamic_range"] = gt->second.fixedParameters.dynamic_range;

        AutoExposure["InitialParameters"]["InitialTime"] = gt->second.initialParameters.InitialTime;
        AutoExposure["InitialParameters"]["isAutoUpdateInitTime"] = gt->second.initialParameters.isAutoUpdateInitTime;
        AutoExposure["InitialParameters"]["isAutoUpdateMaxMinTime"] = gt->second.initialParameters.isAutoUpdateMaxMinTime;
        AutoExposure["InitialParameters"]["rate"] = gt->second.initialParameters.rate;

        AutoExposure["JudgmentMechanism"]["max_time"] = gt->second.judgmentMechanism.max_time;
        AutoExposure["JudgmentMechanism"]["min_time"] = gt->second.judgmentMechanism.min_time;
        AutoExposure["JudgmentMechanism"]["rangeMax"] = gt->second.judgmentMechanism.rangeMax;
        AutoExposure["JudgmentMechanism"]["rangeMin"] = gt->second.judgmentMechanism.rangeMin;
        AutoExposure["JudgmentMechanism"]["targetMax"] = gt->second.judgmentMechanism.target_max;
        AutoExposure["JudgmentMechanism"]["targetMin"] = gt->second.judgmentMechanism.target_min;

        AutoExposure["IterationStepLength"]["belowNormalRange"] = gt->second.iterationStepLength.belowNormalRange;
        AutoExposure["IterationStepLength"]["aboveNormalRange"] = gt->second.iterationStepLength.aboveNormalRange;
        AutoExposure["IterationStepLength"]["totalIterations"] = gt->second.iterationStepLength.totalIterations;

        AutoExposure["IsUseROIs"]["isUseROIs"] = gt->second.isUseROIs.isUseROIs;
        AutoExposure["IsUseROIs"]["isCalculateEntireROIGray"] = gt->second.isUseROIs.isCalculateEntireROIGray;
        AutoExposure["IsUseROIs"]["pixelTotalNumber"] = gt->second.isUseROIs.pixelTotalNumber;
        AutoExposure["IsUseROIs"]["isUseWeightedAverage"] = gt->second.isUseROIs.isUseWeightedAverage;

        for (auto it = gt->second.isUseROIs.rois.begin(); it != gt->second.isUseROIs.rois.end(); it++)
        {
            json roi;
            roi["Name"] = it->first;
            roi["weight"] = it->second.weight;
            roi["x"] = it->second.x;
            roi["y"] = it->second.y;
            roi["width"] = it->second.width;
            roi["height"] = it->second.height;
            AutoExposure["IsUseROIs"]["ROIS"].push_back(roi);
        }
        m_JsonConfig["test"].push_back(AutoExposure);
    }

    std::ofstream os(path);
    if (os.fail())
    {
        //return 0;
        m_mutex.unlock();
        throw std::runtime_error("Unable to open AEConfig File.");
    }
    os << m_JsonConfig.dump(4);
    os.close();
    m_mutex.unlock();
}

json.hpp库下载

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

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

相关文章

隔壁小孩馋哭了都要问我要的MySQL数据库攻略

1 Mysql数据库 1.1 数据库概念 数据 描述事物的符号记录 包括数字、文字、图形、图像声音、档案记录等 以“记录”形式按统一的格式进行存储 表 将不同的记录组织在一起 用来存储具体数据 数据库 标的合集&#xff0c;是存储数据的仓库 以定的组织方式存储打的相互有…

单片机原理及应用:Keil μVision4和Proteus 8的配置介绍

笔者所在的专业最近开设了单片机课程&#xff0c;对笔者而言&#xff0c;虽然之前有一定的代码基础。但还是第一次面对既要求代码架构又要求电路仿真的领域。为了巩固知识和增强记忆&#xff0c;特此创建了这个专栏&#xff0c;谨以一名非电专业初学者的身份记录和分享知识。 …

【软件工程】可执行文件和数据分离

一、概述 可执行文件和数据分离是一种软件设计策略&#xff0c;旨在将程序代码和程序使用的数据分离存储。这种方法通常用于提高软件的模块化程度和灵活性&#xff0c;以及方便软件的管理和维护。 在可执行文件和数据分离中&#xff0c;程序代码通常以可执行文件的形式存储&a…

.net6使用Sejil可视化日志

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; 之前介绍了这篇.net 5使用LogDashboard_.net 5logdashboard rootpath-CSDN博客 这篇文章将会更加的简单&#xff0c;最终的效果都是可视化日志。 在程序非常庞大的时候&…

搬运机器人RFID传感器CNS-RFID-01|1S的RS485(MODBUS|HS协议)通讯连接方法

搬运机器人RFID传感器CNS-RFID-01|1S支持RS485通信&#xff0c;可支持RS485&#xff08;MODBUS RTU&#xff09;协议、RS485-HS协议&#xff0c;广泛应用于物流仓储&#xff0c;立库 AGV|无人叉车|搬送机器人等领域&#xff0c;常用定位、驻车等&#xff0c;本篇重点介绍CNS-RF…

智能优化算法应用:基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工兔算法4.实验参数设定5.算法结果6.参考文…

微信小程序列表点击Item回调

5 data-model 中的model可以定义任何字段 需要在event.currentTarget.dataset.model 中的model 对应即可 onClickItem(event:any) {const model event.currentTarget.dataset.model as ContactItem; // 获取传递的参数//const selectedItem this.data.contactItems[index]; …

AIOps在美团的探索与实践——事件管理篇

美团服务运维团队从事前防御、事中处理、事后运营多个阶段探索AIOps在事件管理领域的应用。本文介绍了在各个运维领域中AIOps的赋能场景&#xff0c;详细阐述了每一个运维场景的业务价值以及算法的具体的落地效果。 0 写在最前 1 背景 2 事件管理中AI能力总览 3 AIOps之事件…

网络安全保障领域

计算机与信息系统安全---最主要领域 云计算安全 IaaS、PasS、SaaS(裸机&#xff0c;装好软件的电脑&#xff0c;装好应用的电脑) 存在风险&#xff1a;开源工具、优先访问权、管理权限、数据处、数据隔离、数据恢复、调查支持、长期发展风险 云计算安全关键技术&#xff1a;可信…

案例分析:西门子智能工厂

西门子全球首家原生数字化工厂&#xff0c;以其独特的数字化技术&#xff0c;在虚拟世界中构建了工厂的数字孪生&#xff0c;从而实现了从需求分析、规划设计、施工实施到生产运营全过程的数字化。这一原生数字化工厂的创新之处在于&#xff0c;它开创性地运用了原生数字孪生理…

STM32 cubeMX 直流电机控制风扇转动

本文使用的是 HAL 库。 文章目录 前言一、直流电机介绍二、直流电机原理图三、直流电机控制方法四、STM32CubeMX 配置直流电机五、代码编写总结 前言 实验开发板&#xff1a;STM32F051K8。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实验目的&#xff1a;了解 直流电机…

iconfont拓展iview图标库

文章目录 前言1.如何下载图标&#xff1f;首先进入官网&#xff0c;找属于自己需求的图标&#xff0c;添加到购物车2.点击右上角的购物车&#xff0c;会来到此页面&#xff0c;点击下载代码3.下载完成后&#xff0c;是一个压缩包&#xff0c;文件内容如下4.在项目assets下新建一…

TCP协议工作原理及实战(一)

实战项目目标&#xff1a; ui搭建&#xff1a;clientconnect 客户端连接 clientdisconnect 客户端断开 socketreaddate 使用套接字传输数据 newconnection新的连接 获取本机的IP地址&#xff1a; 获取本机的ip地址可以参考前面的QT网络编程协议 将得到的ip地址放入combox中…

实现 Spring Boot 项目热重载,无需重启,省时省力

实现 Spring Boot 项目热重载&#xff0c;无需重启&#xff0c;省时省力 插件介绍 通过 JRebel 插件 实现 Spring Boot 项目热重载。类似于前端 Webpack 热重载功能 无需重启&#xff0c;省时省力 安装插件 打开 IDEA 在插件中搜索&#xff1a;JRebel 安装成功后重启IDEA …

[环境配置]win11关闭病毒和威胁防护防止乱删软件

选择桌面的开始图标&#xff0c;选择“设置”功能 点击隐私和安全性功能&#xff0c;进入“Windows安全中心” 点击开启Windows安全中心。 将实时保护和其他保护功能进行关闭就可以了。

【AI美图】第09期效果图,AI人工智能汽车+摩托车系列图集

期待中的未来AI汽车 欢迎来到未来的世界&#xff0c;一个充满创新和无限可能的世界&#xff0c;这里有你从未见过的科技奇迹——AI汽车。 想象一下&#xff0c;你站在十字路口&#xff0c;繁忙的交通信号灯在你的视线中闪烁&#xff0c;汽车如潮水般涌来&#xff0c;但是&…

【论文阅读笔记】SegVol: Universal and Interactive Volumetric Medical Image Segmentation

Du Y, Bai F, Huang T, et al. SegVol: Universal and Interactive Volumetric Medical Image Segmentation[J]. arXiv preprint arXiv:2311.13385, 2023.[代码开源] 【论文概述】 本文思路借鉴于自然图像分割领域的SAM&#xff0c;介绍了一种名为SegVol的先进医学图像分割模型…

Linux用户与文件权限学习

Linux是一个多用户操作系统&#xff0c;允许多个用户同时登录和使用系统资源&#xff0c;在Linux中&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。Linux的多用户管理也可以通过组的概念来…

Python | 使用VIF检测多重共线性

多重共线性是指多元回归模型中有两个或两个以上的自变量&#xff0c;它们之间具有高度的相关性。当某些特征高度相关时&#xff0c;我们可能很难区分它们对因变量的个体影响。多重共线性可以使用各种技术来检测&#xff0c;其中一种技术是方差膨胀因子&#xff08;VIF&#xff…

Windows操作系统中:共享文件夹以及防火墙介绍

目录 一.共享文件夹 1.什么是共享文件夹 2.共享文件夹的优点以及不足 优点 不足之处 3.实际案例操作 共享介绍 普通共享 实例展示 高级共享 实例展示 二.防火墙 1.防火墙介绍 主要功能 2.防火墙常见的应用场景 3.实例操作 操作介绍 出现的问题 解决措施…