Qt开发:JSON字符串的序列化和反序列化
文章目录
- 一、构建和解析单个JSON对象
- 二、JSON对象中嵌套多个JSON对象
- 三、JSON对象中组建多个数组对象
- 四、构建和解析数组对象
一、构建和解析单个JSON对象
1.1 JSON对象的构建
使用key-value形式生成JSON对象
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main() {// 创建 JSON 对象QJsonObject jsonObj;jsonObj["name"] = "张三";jsonObj["age"] = 28;jsonObj["isStudent"] = false;// 转为 JSON 字符串QJsonDocument doc(jsonObj);QString strJson(doc.toJson(QJsonDocument::Compact)); // 或 Indented// 输出 JSON 字符串qDebug() << strJson;return 0;
}
输出结果:
{"name":"张三","age":28,"isStudent":false}
使用insert函数生成JSON对象
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main()
{// 创建 JSON 对象QJsonObject jsonObj;jsonObj.insert("name", "李四");jsonObj.insert("age", 30);jsonObj.insert("isStudent", false);// 转为 JSON 字符串QJsonDocument doc(jsonObj);QString strJson(doc.toJson(QJsonDocument::Indented)); // 或 Indented// 输出 JSON 字符串qDebug() << strJson;return 0;
}
输出结果:
{"name":"李四","age":30,"isStudent":false}
1.2 JSON对象的解析
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main()
{QString jsonString = R"({"name":"张三","age":28,"isStudent":false})";QJsonParseError parseError;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &parseError);if (parseError.error != QJsonParseError::NoError) {qDebug() << "解析错误:" << parseError.errorString();return -1;}if (!doc.isObject()) {qDebug() << "JSON 不是对象类型";return -1;}QJsonObject obj = doc.object();// 判断并提取 nameif (obj.contains("name") && obj["name"].isString()) {QString name = obj["name"].toString();qDebug() << "姓名:" << name;} else {qDebug() << "字段 'name' 缺失或类型错误";}// 判断并提取 ageif (obj.contains("age") && obj["age"].isDouble()) {int age = obj["age"].toInt();qDebug() << "年龄:" << age;} else {qDebug() << "字段 'age' 缺失或类型错误";}// 判断并提取 isStudentif (obj.contains("isStudent") && obj["isStudent"].isBool()) {bool isStudent = obj["isStudent"].toBool();qDebug() << "是否学生:" << isStudent;} else {qDebug() << "字段 'isStudent' 缺失或类型错误";}return 0;
}
输出结果:
二、JSON对象中嵌套多个JSON对象
2.1 构建和解析包含多个子对象的JSON 对象
构建JSON对象:
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main() {// 创建第一个子对象(user1)QJsonObject user1;user1.insert("name", "张三");user1.insert("age", 28);// 创建第二个子对象(user2)QJsonObject user2;user2.insert("name", "李四");user2.insert("age", 30);// 创建顶层 JSON 对象QJsonObject root;root.insert("user1", user1);root.insert("user2", user2);// 将顶层对象序列化为字符串QJsonDocument doc(root);QString jsonStr = doc.toJson(QJsonDocument::Indented);qDebug() << jsonStr;return 0;
}
输出结果:
{"user1": {"name": "张三","age": 28},"user2": {"name": "李四","age": 30}
}
解析JSON对象:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QDebug>int main() {QString jsonString = R"({"user1": { "name": "张三", "age": 28 },"user2": { "name": "李四", "age": 30 }})";// 解析 JSON 字符串QJsonParseError err;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &err);if (err.error != QJsonParseError::NoError) {qDebug() << "解析错误:" << err.errorString();return -1;}if (!doc.isObject()) {qDebug() << "顶层不是 JSON 对象";return -1;}QJsonObject rootObj = doc.object();// 遍历 user1 和 user2for (const QString& key : rootObj.keys()) {QJsonValue val = rootObj.value(key);if (!val.isObject()) {qDebug() << key << "不是 JSON 对象";continue;}QJsonObject userObj = val.toObject();QString name = userObj.contains("name") && userObj["name"].isString()? userObj["name"].toString() : "未知";int age = userObj.contains("age") && userObj["age"].isDouble()? userObj["age"].toInt() : -1;qDebug() << key << ": 姓名 =" << name << ", 年龄 =" << age;}return 0;
}
输出结果:
2.2 子对象中包含JSON对象
构建JSON对象:
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>int main() {// 构建 address 对象 for user1QJsonObject address1;address1.insert("city", "北京");address1.insert("zip", "100000");// 构建 user1 对象QJsonObject user1;user1.insert("name", "张三");user1.insert("age", 28);user1.insert("address", address1);// 构建 address 对象 for user2QJsonObject address2;address2.insert("city", "上海");address2.insert("zip", "200000");// 构建 user2 对象QJsonObject user2;user2.insert("name", "李四");user2.insert("age", 30);user2.insert("address", address2);// 构建根对象QJsonObject root;root.insert("user1", user1);root.insert("user2", user2);// 转为字符串QJsonDocument doc(root);qDebug().noquote() << doc.toJson(QJsonDocument::Indented);return 0;
}
输出结果:
{"user1": {"name": "张三","age": 28,"address": {"city": "北京","zip": "100000"}},"user2": {"name": "李四","age": 30,"address": {"city": "上海","zip": "200000"}}
}
解析JSON对象:
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>int main() {QJsonDocument doc(root);QJsonObject rootObj = doc.object();for (const QString& key : rootObj.keys()) {QJsonObject userObj = rootObj.value(key).toObject();QString name = userObj.value("name").toString();int age = userObj.value("age").toInt();if (userObj.contains("address") && userObj["address"].isObject()) {QJsonObject addr = userObj["address"].toObject();QString city = addr.value("city").toString();QString zip = addr.value("zip").toString();qDebug() << key << ": 姓名 =" << name << ", 年龄 =" << age<< ", 城市 =" << city << ", 邮编 =" << zip;} else {qDebug() << key << ": 姓名 =" << name << ", 年龄 =" << age << "(无地址信息)";}}return 0;
}
输出结果:
三、JSON对象中组建多个数组对象
构建对象:
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main() {// 学生数组QJsonArray studentArray;QJsonObject student1;student1.insert("name", "张三");student1.insert("age", 18);studentArray.append(student1);QJsonObject student2;student2.insert("name", "李四");student2.insert("age", 19);studentArray.append(student2);// 教师数组QJsonArray teacherArray;QJsonObject teacher1;teacher1.insert("name", "王老师");teacher1.insert("subject", "数学");teacherArray.append(teacher1);QJsonObject teacher2;teacher2.insert("name", "赵老师");teacher2.insert("subject", "英语");teacherArray.append(teacher2);// 构建根对象QJsonObject root;root.insert("students", studentArray);root.insert("teachers", teacherArray);// 输出 JSONQJsonDocument doc(root);qDebug().noquote() << doc.toJson(QJsonDocument::Indented);return 0;
}
输出结果:
{"students": [{"name": "张三","age": 18},{"name": "李四","age": 19}],"teachers": [{"name": "王老师","subject": "数学"},{"name": "赵老师","subject": "英语"}]
}
解析对象:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>int main() {QString jsonString = R"({"students": [{ "name": "张三", "age": 18 },{ "name": "李四", "age": 19 }],"teachers": [{ "name": "王老师", "subject": "数学" },{ "name": "赵老师", "subject": "英语" }]})";QJsonParseError err;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &err);if (err.error != QJsonParseError::NoError) {qDebug() << "解析失败:" << err.errorString();return -1;}if (!doc.isObject()) {qDebug() << "JSON 顶层不是对象";return -1;}QJsonObject root = doc.object();// 解析 students 数组if (root.contains("students") && root["students"].isArray()) {QJsonArray students = root["students"].toArray();qDebug() << "[学生列表]";for (const QJsonValue& val : students) {if (val.isObject()) {QJsonObject stu = val.toObject();QString name = stu.value("name").toString("未知");int age = stu.value("age").toInt(-1);qDebug() << "姓名:" << name << ", 年龄:" << age;}}}// 解析 teachers 数组if (root.contains("teachers") && root["teachers"].isArray()) {QJsonArray teachers = root["teachers"].toArray();qDebug() << "\n[教师列表]";for (const QJsonValue& val : teachers) {if (val.isObject()) {QJsonObject teacher = val.toObject();QString name = teacher.value("name").toString("未知");QString subject = teacher.value("subject").toString("未知");qDebug() << "姓名:" << name << ", 学科:" << subject;}}}return 0;
}
输出结果:
四、构建和解析数组对象
生成一个 JSON 数组对象:
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main() {// 创建 JSON 数组QJsonArray jsonArray;// 添加第一个对象QJsonObject obj1;obj1.insert("name", "张三");obj1.insert("age", 18);jsonArray.append(obj1);// 添加第二个对象QJsonObject obj2;obj2.insert("name", "李四");obj2.insert("age", 19);jsonArray.append(obj2);// 序列化为 JSON 字符串(数组作为顶层)QJsonDocument doc(jsonArray);QString jsonStr = doc.toJson(QJsonDocument::Indented);qDebug().noquote() << jsonStr;return 0;
}
输出结果:
[{"name": "张三","age": 18},{"name": "李四","age": 19}
]
解析一个 JSON 数组对象:
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QDebug>int main() {QString jsonString = R"([{ "name": "张三", "age": 18 },{ "name": "李四", "age": 19 }])";// 解析 JSON 字符串QJsonParseError err;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &err);if (err.error != QJsonParseError::NoError) {qDebug() << "解析失败:" << err.errorString();return -1;}if (!doc.isArray()) {qDebug() << "顶层不是数组";return -1;}QJsonArray array = doc.array();// 遍历数组for (const QJsonValue& val : array) {if (!val.isObject()) continue;QJsonObject obj = val.toObject();QString name = obj.value("name").toString("未知");int age = obj.value("age").toInt(-1);qDebug() << "姓名:" << name << ", 年龄:" << age;}return 0;
}
输出结果: