《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,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。 json.hpp库在文章末尾下载 读写主要有两种方式,第一种根据键值对读写&…...
SQL进阶理论篇(二十一):基于SQLMap的自动化SQL注入
文章目录 简介获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查看heros数据表中的所有字段查询heros表中的英雄信息总结参考文献 简介 从上一小节,可以发现,如果我们编写的代码存在着SQL注入的漏洞,后果…...
xtu oj 1055 整数分类
Description 按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,246,则24的类别数是6&a…...
(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散
Shifted Diffusion for Text-to-image Generation 公众:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 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四、最后 一、前言 容器化时代,当页面出现问题时,如果你的新版本有可能已经修复了,那样你再排查它就没有意义了。为什么不一定是最新版本呢?一是可能是缓存作祟,二是可能运维成员…...
Android 10.0 SystemUI禁用长按recent键的分屏功能
1.前言 在10.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 2.SystemUI禁用长按recent键的分屏功能的核心类 frameworks\base\packa…...
自媒体实战篇:作品爆款三要素的使用场景和重要性
作品爆款三要素的使用场景和重要性 什么是爆款三要素 标题 概括视频内容,吸引用户注意封面 吸引眼球,引发作者联想标签 精准分类,有利于平台精准推流优质标题要求 标题就是介绍视频故事内容的一段话,通常分为三段式注册,统称三段式标题好的标题统称是三段式的,即点明故事…...
Hbase的安装配置
注:本文默认已经完成hadoop的下载以及环境配置 1.上传zookeeper和hbase压缩包到指令路径并且解压 (理论上讲,hbase其实内置了zookeeper,我们也可以不另外下载,另外下载的目的在于减少组件间依赖性) 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:去除了字符串开头前和结尾后的空白; simplified:去除了字符串开头前和结尾后的空白,以及中间内部的空白字符也去掉(\t,\n,\v,\f,\r和 ) 代码: QString str " 1 2 3 4 5 …...
Ensp dhcp全局地址池(配置命令 + 实例)
使用DHCP的好处:减少管理员的工作量、避免输入错误的可能、避免ip冲突 DHCP报文类型: DHCP DISCOVER:客户端用来寻找DHCP服务器 DHCP OFFER:DHCP服务器用来响应DHCP DISCOVER报文,此报文携带了各种配置信息 DHCP REQUEST:客户端配置请求确…...
spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop
前言:本文不介绍 AOP 的基本概念、动态代理方式实现 AOP,以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP,也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…...
C语言操作符if语句好习惯 详解分析操作符(详解4)
各位少年: 前言 还记得我们上一章讲过一个比较抽象的代码,它要比较两次都是真的情况下才能打印,那么很显然这样写代码是有弊端的?哪我们C语言之父丹尼斯.里奇,先介绍一下上次拉掉了if语句的好习惯 好再分享一些操作符…...
【什么是泛型,有什么好处】
✅什么是泛型,有什么好处 ✅典型回答✅泛型是如何实现的✅什么是类型擦除?📝C语言对泛型的支持📝泛型擦除的缺点有哪些? ✅对泛型通配符的理解📝泛型中上下界限定符 extends 和 super 有什么区别࿱…...
Stable Diffusion系列(三):网络分类与选择
文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时,为了提升绘图质量,可以多种网络混合使用,可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …...
Twincat中PLC的ST语言编程实现机器人安全交互
在TwinCAT中,使用ST语言(Structured Text)进行PLC编程是一种常见的做法。 机器人接触力超过预设阈值后执行停止动作 为了实现机器人在接触力超过预设阈值后停止动作的功能,你需要编写一段ST语言代码,以检查当前的接触…...
Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01
前言 直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。 在直播间贡献榜中,每个观众都有一个对应的贡献值&#…...
如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎
文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…...
C语言数据结构-----常用七种排序介绍、分类、实现及性能比较
前言 ①排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 ②稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序&#…...
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码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
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:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
