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

猜你喜欢

转载自blog.csdn.net/cs1395293598/article/details/135206276