基于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 }

 image

posted @ 2026-02-03 15:42  左边的翼  阅读(8)  评论(0)    收藏  举报