当前位置: 首页 > news >正文

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;
}

输出结果:
在这里插入图片描述

相关文章:

  • 【OSG学习笔记】Day 14: 操作器(Manipulator)的深度使用
  • 基于机器学习的电影票房预测
  • 万象生鲜配送系统代码2025年4月29日更新日志
  • LeetCode 155题解 | 最小栈
  • 【Leetcode 每日一题 - 补卡】2302. 统计得分小于 K 的子数组数目
  • Linux电源管理(3)_关机和重启的过程
  • 第十六届蓝桥杯 2025 C/C++组 密密摆放
  • 探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍
  • AI赋能的问答系统:2025年API接口实战技巧
  • 【Redis——数据类型和内部编码和Redis使用单线程模型的分析】
  • 基于Arduino的STM32F103RCT6最小系统板的测试及串口通讯
  • 深度学习中的优化算法:基础全面解析
  • 聊聊Spring AI Alibaba的PlantUMLGenerator
  • 安装deepspeed时出现了以下的错误,如何解决CUDA_HOME does not exist
  • 【Java面试笔记:进阶】28.谈谈你的GC调优思路?
  • 解决STM32H743单片机USB_HOST+FATF操作usb文件
  • 从 Pretrain 到 Fine-tuning:大模型迁移学习的核心原理剖析
  • 实验六 文件操作实验
  • CISC与RISC详解:定义、区别及典型处理器
  • 使用 ECharts 在 Vue3 中柱状图的完整配置解析
  • 专访|200余起诉讼,特朗普上台100天,美国已进入宪政危机
  • 华夏银行一季度营收降逾17%、净利降逾14%,公允价值变动损失逾24亿
  • 市场监管总局:2024年查办商标、专利等领域违法案件4.4万件
  • 这座“蚌埠住了”的城市不仅会接流量,也在努力成为文旅实力派
  • 宁波银行一季度净利74.17亿元增5.76%,不良率持平
  • 上海“生育友好岗”已让4000余人受益,今年将推产假社保补贴政策