一, 需求
Qt本身的json 用起来很麻烦,建议选用nlohmann 这个库来对json格式进行处理。
二, 使用
- 个人倾向于直接将源码放到目录下,然后直接引用头文件。
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);
- 这个库有个好处,就是可以将结构体或者类序列化和反序列化,直接转成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;
}
- 解析一个嵌套的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();
}
}