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

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

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

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

相关文章

Linux 与 Shell

Linux系统的四部分&#xff1a;Linux系统的核心是内核。内核主要负责四种功能&#xff1a; 系统内存管理 操作系统内核的主要功能之一&#xff1a;内存管理。&#xff08;物理内存 虚拟内存&#xff09;内核通过硬盘上称为交换空间&#xff08;swap space&#xff09;的存储区…

知识付费网站搭建不再神秘,小白也能轻松掌握

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化…

mySQL事务与存储引擎

目录 mySQL事务 1.事务的概念 2.事务的ACID特点 3.多客户端同时访问一个表时&#xff0c;出现的一致性问题 4.事务的隔离级别 5.事务的隔离级别作用范围 查询全局事务隔离级别 设置全局事务隔离级别 ​编辑查询会话事务隔离级别 设置会话事务隔离级别 6.事务控制语句…

Python爬虫中文乱码处理实例代码解析

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python爬虫中文乱码处理实例代码解析。全文2800字&#xff0c;阅读大约8分钟 在进行网络数据抓取时&#xff0c;常常会遇到中文乱码的问题&#xff0c;这可能导致数据无法正…

ts相关笔记(extends、infer、Pick、Omit)

最近刷了本ts小册&#xff0c;对一些知识点做下笔记。 extends extends 是一个关键字&#xff0c;用于对类型参数做一些约束。 A extends B 意味着 A 是 B 的子类型&#xff0c;比如下面是成立的 ‘abc’ extends string599 extends number 看下面例子&#xff1a; type …

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

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

分享71个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1frK-W3GT8WrydSlQ-E3o6A?pwd6666 提取码&#xff1a;6666 UI代码 def __init__(self):import …

爬虫课程考试方式说明

爬虫课程考试方式说明 一、开课情况 考查课 082116415 50人&#xff0c;0864211&#xff0c;1-15单周 理论学时16 实验学时0 上课地点&#xff1a;周一 3-4节 十号教学楼A303 51人&#xff0c;0864212&#xff0c;1-15单周 理论学时16 实验学时0 上课地点&#xff1a;周四 3-4…

案例分析:三一重工集团数字化转型

三一重工集团&#xff0c;作为制造业中的数字化转型佼佼者&#xff0c;荣获“全球灯塔工厂”的殊荣&#xff0c;率先采用了物联网、云计算、大数据等尖端技术手段。数字化转型让三一重工步入了全面信息化的管理时代&#xff0c;通过ERP、CRM、HRM等系统的协同运作&#xff0c;实…

vs2008编译报错:1>cl: 命令行 error D8016 :“/MTd”和“/clr:oldsyntax”命令行选项不兼容

使用cypress的驱动进行编译&#xff0c;报错如下&#xff1a; 1>------ 已启动全部重新生成: 项目: Streamer, 配置: Debug Win32 ------ 1>正在删除项目“Streamer”(配置“Debug|Win32”)的中间文件和输出文件 1>正在编译... 1>cl: 命令行 warning D9035 :“clr…

【Redis】七、Redis主从复制(重点)

文章目录 1、概念1.1、主从复制的作用主要包括1.2、一般来说&#xff0c;要将Redis运用于工程项目中&#xff0c;只使用一台Redis是万万不能的&#xff08;宕机&#xff09;&#xff0c;原因如下 2、环境配置2.1、复制拷贝3个配置文件&#xff0c;然后修改对应的信息拷贝文件改…

使用tesla gpu 加速大模型,ffmpeg,unity 和 UE等二三维应用

我们知道tesla gpu 没有显示器接口&#xff0c;那么在windows中怎么使用加速unity ue这种三维编辑器呢&#xff0c;答案就是改变注册表来加速相应的三维渲染程序. 1 tesla gpu p40 p100 加速 在windows中使用regedit 来改变 核显配置&#xff0c; 让p100 p40 等等显卡通过核显…

SpringBoot整合Redis完整篇

SpringBoot整合Redis完整篇 1、在springboot项目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

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 相关的数…

[kubernetes]Kube-APIServer

API Server API Server是什么 提供集群管理的REST API接口&#xff0c;包括认证授权、数据校验以及集群状态变更等提供其他模块之间的数据交互和通信的枢纽&#xff08;其他模块通过API Server查询或修改数据&#xff0c;只有API Server才直接操作etcd&#xff09; 访问控制…

多组件卡片式问答引擎

#本篇文章联合同花顺人工智能领域开发者严同学创作 1.简介 为了满足用户个性化需求以及精细化运营&#xff0c;越来越多的企业推出多组件式的卡片问答&#xff0c;这种回答方式不会千篇一律&#xff0c;能够更好地为客户提供服务&#xff0c;帮助客户解决问题。 使用这种问答…

“React学习之旅:从入门到精通的点滴感悟“

在探索和学习React的过程中&#xff0c;我逐渐领悟到了前端开发的魅力与挑战。React&#xff0c;作为Facebook推出的开源JavaScript库&#xff0c;以其独特的思维方式和强大的功能&#xff0c;引领着前端开发的潮流。在这篇文章中&#xff0c;我将分享我的React学习心得&#x…

一个int型有序数组,如何拿到最低的值和这个值一共存在多少个?

一个int型有序数组&#xff0c;如何拿到最低的值和这个值一共存在多少个&#xff1f; 示例代码&#xff1a; int min 0;int os 1;int[] element {5,4,4,2,2};for (int i : element) {if (i min) {os;} else {min i;os 1;}}System.out.println("min " min);S…

PortSwigger Access Control

lab1: Unprotected admin functionality 访问robots.txt 进了删除即可 lab2: Unprotected admin functionality with unpredictable URL 访问admin-d0qwj5 lab3: User role controlled by request parameter 发现Cookie中存在判断是否为admin lab4: User role can be modifie…

test assert-01-Google Truth 断言

Truth Truth 是用于Java测试的断言框架&#xff0c;灵感来自于FEST&#xff0c;并受到一些可扩展性需求的驱动&#xff0c;几乎完全由谷歌员工在业余时间编写&#xff0c;或者作为Java核心图书馆管理员的身份做出贡献。 作用 作为工程师&#xff0c;我们花费大部分的时间来阅…