Qt中轻松玩转JSON:从解析到序列化的全面指南**
在现代软件开发中,JSON(JavaScript Object Notation)作为一种轻量级、易读写的数据交换格式,已经成为前后端通信、配置文件存储、数据序列化等场景的首选,Qt框架作为强大的跨平台C++ GUI开发库,提供了完善的JSON支持,使得在Qt应用中处理JSON数据变得异常简单,本文将详细介绍如何在Qt中使用JSON,包括解析(读取)JSON数据、序列化(生成)JSON数据,以及相关的常用类和操作。
Qt中的JSON相关类
Qt主要通过以下几个类来处理JSON数据,它们都位于QtJson模块中(在使用时需要确保.pro文件中包含了qt += core json):
- QJsonDocument:表示一个完整的JSON文档,它可以包含一个JSON对象(
QJsonObject)或一个JSON数组(QJsonArray),它还提供了将JSON文档转换为字节流(QByteArray)以及从字节流创建JSON文档的方法,便于网络传输或文件存储。 - QJsonObject:表示一个JSON对象,类似于C++中的
std::map或Python中的字典,它存储了一系列的键值对,其中键是字符串,值可以是QJsonValue支持的任意类型。 - QJsonArray:表示一个JSON数组,类似于C++中的
std::vector或Python中的列表,它存储了一系列有序的QJsonValue值。 - QJsonValue:表示JSON中的一个值,可以是:null、bool、double(用于数字)、string、array、object,它是所有JSON值的基本表示单元。
- QJsonParseError:用于在JSON解析过程中报告错误,包含错误代码和错误位置等信息。
解析JSON数据(读取JSON)
解析JSON数据通常是指将JSON格式的字符串或字节流转换为Qt的JSON对象,以便在程序中操作,常见的数据源可能来自网络响应、配置文件或用户输入。
步骤:
- 获取JSON数据:通常是一个
QString或QByteArray。 - 使用QJsonDocument::fromJson()进行解析:该方法将
QByteArray转换为QJsonDocument。 - 检查解析错误:使用
QJsonParseError对象检查解析是否成功。 - 访问JSON数据:根据JSON的结构,通过
QJsonDocument获取QJsonObject或QJsonArray,然后逐层访问其中的值。
示例代码:
假设我们有以下JSON字符串:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": ["语文", "数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
解析它的C++代码如下:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
#include <QDebug>
#include <QByteArray>
void parseJsonExample() {
QByteArray jsonData = R"(
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": ["语文", "数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
)";
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError);
if (parseError.error != QJsonParseError::NoError) {
qWarning() << "JSON解析错误:" << parseError.errorString();
return;
}
// 检查是否为对象
if (!jsonDoc.isObject()) {
qWarning() << "JSON文档不是对象";
return;
}
QJsonObject jsonObj = jsonDoc.object();
// 访问字符串值
if (jsonObj.contains("name") && jsonObj["name"].isString()) {
QString name = jsonObj["name"].toString();
qDebug() << "姓名:" << name;
}
// 访问整数值
if (jsonObj.contains("age") && jsonObj["age"].isDouble()) { // JSON中没有整数类型,数字用double表示
int age = jsonObj["age"].toInt();
qDebug() << "年龄:" << age;
}
// 访问布尔值
if (jsonObj.contains("isStudent") && jsonObj["isStudent"].isBool()) {
bool isStudent = jsonObj["isStudent"].toBool();
qDebug() << "是否是学生:" << isStudent;
}
// 访问数组
if (jsonObj.contains("courses") && jsonObj["courses"].isArray()) {
QJsonArray coursesArray = jsonObj["courses"].toArray();
qDebug() << "课程列表:";
for (int i = 0; i < coursesArray.size(); ++i) {
if (coursesArray[i].isString()) {
qDebug() << " -" << coursesArray[i].toString();
}
}
}
// 访问嵌套对象
if (jsonObj.contains("address") && jsonObj["address"].isObject()) {
QJsonObject addressObj = jsonObj["address"].toObject();
QString city = addressObj["city"].toString();
QString district = addressObj["district"].toString();
qDebug() << "地址:" << city << district;
}
}
序列化JSON数据(生成JSON)
序列化JSON数据是指将程序中的数据(如Qt对象、自定义数据结构)转换为JSON格式的字符串或字节流,以便存储到文件或通过网络发送。
步骤:
- 构建JSON结构:使用
QJsonObject、QJsonArray和QJsonValue来构建你想要的JSON数据结构。 - 创建QJsonDocument:将构建好的
QJsonObject或QJsonArray封装到QJsonDocument中。 - 转换为QByteArray:使用
QJsonDocument::toJson()方法将JSON文档转换为QByteArray。 - 输出或传输:将
QByteArray写入文件、发送到网络或进行其他处理。
示例代码:
将上面的示例数据反向构建成JSON字符串:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QByteArray>
QByteArray generateJsonExample() {
// 创建地址对象
QJsonObject addressObj;
addressObj["city"] = "北京";
addressObj["district"] = "海淀区";
// 创建课程数组
QJsonArray coursesArray;
coursesArray.append("语文");
coursesArray.append("数学");
coursesArray.append("英语");
// 创建主JSON对象
QJsonObject jsonObj;
jsonObj["name"] = "张三";
jsonObj["age"] = 30; // 可以直接赋值int,会自动转为QJsonValue::Double
jsonObj["isStudent"] = false;
jsonObj["courses"] = coursesArray;
jsonObj["address"] = addressObj;
// 创建JSON文档
QJsonDocument jsonDoc(jsonObj);
// 转换为JSON字符串 (QByteArray)
// 可以使用 QJsonDocument::Indented 来格式化输出,便于阅读
QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);
qDebug() << "生成的JSON数据:";
qDebug() << jsonData;
return jsonData;
}
从自定义类到JSON的转换(高级)
在实际开发中,我们经常需要将自定义的C++类对象序列化为JSON,或者从JSON反序列化为自定义类对象,这通常需要手动编写转换逻辑。
示例:自定义类与JSON互转
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonValue>
class Person {
public:
QString name;
int age;
bool isStudent;
QStringList courses;
QJsonObject address; // 为了简单,address也用QJsonObject表示
// 从JSON对象构造Person
static Person fromJson(const QJsonObject &jsonObj) {
Person person;
person.name = jsonObj["name"].toString();
person.age = jsonObj["age"].toInt();
person.isStudent = jsonObj["isStudent"].toBool();
if (jsonObj["courses"].isArray()) {
QJsonArray coursesArray = jsonObj["courses"].toArray();
for (const QJsonValueRef &value : coursesArray) {
person.courses.append(value.toString());
}
}
person.address = jsonObj["address"].toObject();
return person;
}
// 转换为JSON对象
QJsonObject toJson() const {
QJsonObject jsonObj;
jsonObj["name"] = name;
jsonObj["age"] = age;
jsonObj["isStudent"] = isStudent;
QJsonArray coursesArray;
for (const QString &course : courses) {
coursesArray.append(course);
}
jsonObj["courses"] = coursesArray;
jsonObj["address"] = address;
return jsonObj;
}
};
// 使用示例
void personJson


还没有评论,来说两句吧...