一, 需求
Qt本身的json 用起来很麻烦,建议选用nlohmann 这个库来对json格式进行处理。

二, 使用

  1. 个人倾向于直接将源码放到目录下,然后直接引用头文件。
    https://github.com/nlohmann/json
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;

std::ifstream f("example.json");
json data = json::parse(f);
  1. 这个库有个好处,就是可以将结构体或者类序列化和反序列化,直接转成json,或者由json生成。

#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// 定义一个结构体
struct Person {
    std::string name;
    int age;
    std::string address;

    // 反序列化方法,将 JSON 对象解析为结构体
    static Person from_json(const json& j) {
        Person person;
        person.name = j.at("name").get<std::string>();
        person.age = j.at("age").get<int>();
        person.address = j.at("address").get<std::string>();
        return person;
    }
};

int main() {
    // JSON 字符串,包含 Person 数据
    std::string json_str = R"(
        {
            "name": "John Doe",
            "age": 30,
            "address": "123 Main St, City"
        }
    )";

    // 解析 JSON 字符串
    json j = json::parse(json_str);

    // 将 JSON 反序列化为 Person 结构体
    Person person = Person::from_json(j);

    // 打印反序列化后的 Person 对象
    std::cout << "Name: " << person.name << std::endl;
    std::cout << "Age: " << person.age << std::endl;
    std::cout << "Address: " << person.address << std::endl;

    return 0;
}
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// 定义一个结构体
struct Person {
    std::string name;
    int age;
    std::string address;

    // 将结构体序列化为 JSON 对象
    json to_json() const {
        return {
            {"name", name},
            {"age", age},
            {"address", address}
        };
    }
};

int main() {
    // 创建一个 Person 对象
    Person person;
    person.name = "John Doe";
    person.age = 30;
    person.address = "123 Main St, City";

    // 将结构体序列化为 JSON 对象
    json j = person.to_json();

    // 打印序列化后的 JSON 对象
    std::cout << j.dump(4) << std::endl;  // 使用 4 个空格缩进格式化输出

    return 0;
}
  1. 解析一个嵌套的json
    
    //json 长这样
    [
    {
        "type": "abc",
        "template":"1.stl",
        "dataList": [
            {
                "angle": 30,
                "track": "track1"
            },
            {
                "angle": 30,
                "track": "track1"
            },{
                "angle": 30,
                "track": "track1"
            }
        ]
    },
    {
        "type": "cde",
        "template":"2.stl",
        "dataList": [
            {
                "angle": 30,
                "track": "track1"
            },
            {
                "angle": 30,
                "track": "track1"
            },{
                "angle": 30,
                "track": "track1"
            }
        ]
    }
    ]
//读取
//定义结构体
struct Data{
    //产品型号
    QString type;
    //模板文件
    QString templateFile;
    //转台角度 对应的轨迹
    QMap angleToTrack;
};

//数据
QList allData;

//解析
void Widget::initData()
{
    //读取json文件
    QString filePath = QCoreApplication::applicationDirPath()+"/data.json";
    QFile file(filePath);
    if(file.exists()){
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "Failed to open file:" << file.errorString();
            return;
        }

        QTextStream in(&file);
        QString content = in.readAll();

        json li = json::parse(content.toStdString());
        allData.clear();
        for (const auto& item : li) {
            Data data;
            std::string type = item["type"];
            std::string templateFile = item["template"];
            data.type = QString::fromStdString(type);
            data.templateFile = QString::fromStdString(templateFile);

            json dataList = item["dataList"];
            for (const auto& obj : dataList) {
                QMap angleToTrackMap;
                float angle =  obj["angle"];
                std::string track = obj["track"];
                angleToTrackMap.insert(angle,QString::fromStdString(track));
                data.angleToTrack = angleToTrackMap;
            }
            allData.append(data);
        }

        file.close();
    }
}