基于nlohmann的JSON文件的读取应用
1、JSON文件格式如下
1 { 2 "Use_Sign": { 3 "Up_Board": "0", 4 "Divide_Board": "0", 5 "Insert_Machine": "0", 6 "Front_CCD": "0", 7 "Wave_Soldering": "0", 8 "Back_AOI": "0", 9 "Glue_Machine": "0", 10 "Scanner": "1", 11 "Line_Number": "M703", 12 "Scanner_Style": "1", 13 "Com_Port":"COM4", 14 "Baud_Rate":"9600" 15 }, 16 "Up_Board_Info": { 17 "Ip_Address": "127.0.0.1", 18 "Port_Number": "502" 19 }, 20 "Divide_Board_Info": { 21 "Ip_Address": "10.56.20.254", 22 "Port_Number": "60000" 23 }, 24 "Insert_Machine_Info": [ 25 { 26 "Ip_Address": "10.56.20.200", 27 "Port_Number": "8081" 28 }, 29 { 30 "Ip_Address": "10.56.20.200", 31 "Port_Number": "8082" 32 }, 33 { 34 "Ip_Address": "10.56.20.200", 35 "Port_Number": "8083" 36 } 37 ], 38 "Front_CCD_Info": { 39 "Ip_Address": "10.56.20.200", 40 "Port_Number": "8084" 41 }, 42 "Wave_Soldering_Info": { 43 "Ip_Address": "10.56.20.200", 44 "Port_Number": "8085" 45 }, 46 "Back_AOI_Info": { 47 "Ip_Address": "10.56.20.200", 48 "Port_Number": "8086" 49 }, 50 "Scanner_Info": { 51 "Ip_Address": "10.57.6.154", 52 "Port_Number": "23" 53 }, 54 "Glue_Machine_Info": { 55 "Ip_Address": "10.56.20.200", 56 "Port_Number": "8087" 57 } 58 }
2、针对1中的JSON格式文件定义结构体及数据基本操作(Config.h)
1 #pragma once 2 #include <nlohmann/json.hpp> 3 #include <string> 4 #include <vector> 5 #include <iostream> 6 #include <fstream> 7 using namespace std; 8 using json = nlohmann::json; 9 10 //the info of device 11 struct DeviceInfo { 12 std::string Ip_Address; 13 std::string Port_Number; 14 15 // 重载输出运算符,方便调试 16 friend std::ostream& operator<<(std::ostream& os, const DeviceInfo& info) { 17 return os << "IP: " << info.Ip_Address << ", Port: " << info.Port_Number; 18 } 19 }; 20 21 struct MachineConfig { 22 struct { 23 std::string Up_Board; 24 std::string Divide_Board; 25 std::string Insert_Machine; 26 std::string Front_CCD; 27 std::string Wave_Soldering; 28 std::string Back_AOI; 29 std::string Glue_Machine; 30 std::string Scanner; 31 std::string Line_Number; 32 std::string Scanner_Style; 33 std::string Com_Port; 34 std::string Baud_Rate; 35 } Use_Sign; 36 37 DeviceInfo Up_Board_Info; 38 DeviceInfo Divide_Board_Info; 39 std::vector<DeviceInfo> Insert_Machine_Info; 40 DeviceInfo Front_CCD_Info; 41 DeviceInfo Wave_Soldering_Info; 42 DeviceInfo Back_AOI_Info; 43 DeviceInfo Glue_Machine_Info; 44 DeviceInfo Scanner_Info; 45 }; 46 47 // JSON反序列化 48 inline void from_json(const json& j, DeviceInfo& d) { 49 j.at("Ip_Address").get_to(d.Ip_Address); 50 j.at("Port_Number").get_to(d.Port_Number); 51 } 52 53 inline void from_json(const json& j, MachineConfig& config) { 54 // 解析Use_Sign部分 55 const auto& use_sign = j.at("Use_Sign"); 56 use_sign.at("Up_Board").get_to(config.Use_Sign.Up_Board); 57 use_sign.at("Divide_Board").get_to(config.Use_Sign.Divide_Board); 58 use_sign.at("Insert_Machine").get_to(config.Use_Sign.Insert_Machine); 59 use_sign.at("Front_CCD").get_to(config.Use_Sign.Front_CCD); 60 use_sign.at("Wave_Soldering").get_to(config.Use_Sign.Wave_Soldering); 61 use_sign.at("Back_AOI").get_to(config.Use_Sign.Back_AOI); 62 use_sign.at("Glue_Machine").get_to(config.Use_Sign.Glue_Machine); 63 use_sign.at("Scanner").get_to(config.Use_Sign.Scanner); 64 use_sign.at("Line_Number").get_to(config.Use_Sign.Line_Number); 65 use_sign.at("Scanner_Style").get_to(config.Use_Sign.Scanner_Style); 66 use_sign.at("Com_Port").get_to(config.Use_Sign.Com_Port); 67 use_sign.at("Baud_Rate").get_to(config.Use_Sign.Baud_Rate); 68 69 // 解析各设备信息 70 j.at("Up_Board_Info").get_to(config.Up_Board_Info); 71 j.at("Divide_Board_Info").get_to(config.Divide_Board_Info); 72 j.at("Insert_Machine_Info").get_to(config.Insert_Machine_Info); 73 j.at("Front_CCD_Info").get_to(config.Front_CCD_Info); 74 j.at("Wave_Soldering_Info").get_to(config.Wave_Soldering_Info); 75 j.at("Back_AOI_Info").get_to(config.Back_AOI_Info); 76 j.at("Glue_Machine_Info").get_to(config.Glue_Machine_Info); 77 j.at("Scanner_Info").get_to(config.Scanner_Info); 78 }
3、数据读取及打印测试
1 #include <iostream> 2 #include "ConfigInfo.h" 3 4 using namespace std; 5 static MachineConfig m_pConfigInfo; 6 7 static MachineConfig load_config(const std::string& filename){ 8 std::ifstream ifs(filename); 9 if (!ifs.is_open()) { 10 std::cout << "can not open the config file: " << filename << endl; 11 } 12 13 json j; 14 ifs >> j; 15 return j.get<MachineConfig>(); 16 } 17 18 19 int main() 20 { 21 m_pConfigInfo = load_config("..\\x64\\LamdaLearn\\Config.json"); 22 std::cout << m_pConfigInfo.Divide_Board_Info << std::endl; 23 24 for(const auto& device:m_pConfigInfo.Insert_Machine_Info) 25 std::cout << device << std::endl; 26 }

记性太差,需要这么记下来

浙公网安备 33010602011771号