当前位置: 首页 > news >正文

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

相关文章:

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

c11 json解析库nlohmann/json.hpp文件整个代码由一个头文件组成 json.hpp&#xff0c;没有子项目&#xff0c;没有依赖关系&#xff0c;没有复杂的构建系统&#xff0c;使用起来非常方便。 json.hpp库在文章末尾下载 读写主要有两种方式&#xff0c;第一种根据键值对读写&…...

SQL进阶理论篇(二十一):基于SQLMap的自动化SQL注入

文章目录 简介获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查看heros数据表中的所有字段查询heros表中的英雄信息总结参考文献 简介 从上一小节&#xff0c;可以发现&#xff0c;如果我们编写的代码存在着SQL注入的漏洞&#xff0c;后果…...

xtu oj 1055 整数分类

Description 按照下面方法对整数x进行分类&#xff1a;如果x是一个个位数&#xff0c;则x属于x类&#xff1b;否则将x的各位上的数码累加&#xff0c;得到一个新的x&#xff0c;依次迭代&#xff0c;可以得到x的所属类。比如说24&#xff0c;246&#xff0c;则24的类别数是6&a…...

(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散

Shifted Diffusion for Text-to-image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…...

ACE中为socket增加keepalive策略(windows和linux)

0、现象描述 在国产麒麟系统下,基于ACE的tcp-socket,如果长时间不操作,则会自动切断连接,经测试发现,这个时间的上限为30分钟(几乎不差1秒) 经查看/proc/sys/net/ipv4/tcp_keepalive_time=7200,按说是2小时,但测试发现就是30分钟。索性,就通过程序来动态设置keepaliv…...

前端工程注入版本号

文章目录 一、前言二、webpack三、vite四、最后 一、前言 容器化时代&#xff0c;当页面出现问题时&#xff0c;如果你的新版本有可能已经修复了&#xff0c;那样你再排查它就没有意义了。为什么不一定是最新版本呢&#xff1f;一是可能是缓存作祟&#xff0c;二是可能运维成员…...

Android 10.0 SystemUI禁用长按recent键的分屏功能

1.前言 在10.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 2.SystemUI禁用长按recent键的分屏功能的核心类 frameworks\base\packa…...

自媒体实战篇:作品爆款三要素的使用场景和重要性

作品爆款三要素的使用场景和重要性 什么是爆款三要素 标题 概括视频内容,吸引用户注意封面 吸引眼球,引发作者联想标签 精准分类,有利于平台精准推流优质标题要求 标题就是介绍视频故事内容的一段话,通常分为三段式注册,统称三段式标题好的标题统称是三段式的,即点明故事…...

Hbase的安装配置

注&#xff1a;本文默认已经完成hadoop的下载以及环境配置 1.上传zookeeper和hbase压缩包到指令路径并且解压 (理论上讲&#xff0c;hbase其实内置了zookeeper&#xff0c;我们也可以不另外下载&#xff0c;另外下载的目的在于减少组件间依赖性) cd /home mkir hbase cd /hom…...

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…...

QT trimmed和simplified

trimmed&#xff1a;去除了字符串开头前和结尾后的空白&#xff1b; simplified&#xff1a;去除了字符串开头前和结尾后的空白&#xff0c;以及中间内部的空白字符也去掉&#xff08;\t,\n,\v,\f,\r和 &#xff09; 代码&#xff1a; QString str " 1 2 3 4 5 …...

Ensp dhcp全局地址池(配置命令 + 实例)

使用DHCP的好处&#xff1a;减少管理员的工作量、避免输入错误的可能、避免ip冲突 DHCP报文类型&#xff1a; DHCP DISCOVER:客户端用来寻找DHCP服务器 DHCP OFFER:DHCP服务器用来响应DHCP DISCOVER报文&#xff0c;此报文携带了各种配置信息 DHCP REQUEST:客户端配置请求确…...

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言&#xff1a;本文不介绍 AOP 的基本概念、动态代理方式实现 AOP&#xff0c;以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP&#xff0c;也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…...

C语言操作符if语句好习惯 详解分析操作符(详解4)

各位少年&#xff1a; 前言 还记得我们上一章讲过一个比较抽象的代码&#xff0c;它要比较两次都是真的情况下才能打印&#xff0c;那么很显然这样写代码是有弊端的&#xff1f;哪我们C语言之父丹尼斯.里奇&#xff0c;先介绍一下上次拉掉了if语句的好习惯 好再分享一些操作符…...

【什么是泛型,有什么好处】

✅什么是泛型&#xff0c;有什么好处 ✅典型回答✅泛型是如何实现的✅什么是类型擦除&#xff1f;&#x1f4dd;C语言对泛型的支持&#x1f4dd;泛型擦除的缺点有哪些&#xff1f; ✅对泛型通配符的理解&#x1f4dd;泛型中上下界限定符 extends 和 super 有什么区别&#xff1…...

Stable Diffusion系列(三):网络分类与选择

文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时&#xff0c;为了提升绘图质量&#xff0c;可以多种网络混合使用&#xff0c;可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …...

Twincat中PLC的ST语言编程实现机器人安全交互

在TwinCAT中&#xff0c;使用ST语言&#xff08;Structured Text&#xff09;进行PLC编程是一种常见的做法。 机器人接触力超过预设阈值后执行停止动作 为了实现机器人在接触力超过预设阈值后停止动作的功能&#xff0c;你需要编写一段ST语言代码&#xff0c;以检查当前的接触…...

Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01

前言 直播间贡献榜是一种常见的直播平台功能&#xff0c;用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名&#xff0c;并实时更新&#xff0c;以鼓励观众积极参与直播活动。 在直播间贡献榜中&#xff0c;每个观众都有一个对应的贡献值&#…...

如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…...

C语言数据结构-----常用七种排序介绍、分类、实现及性能比较

前言 ①排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 ②稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...