JSON在Qt中的使用:从基础到实践
在跨平台开发中,数据交换格式的选择至关重要,JSON(JavaScript Object Notation)以其轻量、易读、易解析的特性,成为Qt应用中与Web服务、配置文件、数据存储等场景交互的主流格式,本文将详细介绍JSON在Qt中的使用方法,从核心类到实际应用场景,帮助开发者快速JSON数据的处理技巧。
Qt中JSON相关核心类
Qt提供了QJsonDocument、QJsonObject、QJsonArray、QJsonValue等类来支持JSON操作,这些类位于QtJson模块(需在.pro文件中添加QT += json),通过它们,开发者可以轻松实现JSON数据的构建、解析、修改和序列化。
QJsonDocument:JSON文档的容器
QJsonDocument是整个JSON文档的封装,它可以是JSON对象(QJsonObject)或JSON数组(QJsonArray)的序列化结果,主要功能包括:
- 从
QJsonObject或QJsonArray创建文档; - 将文档转换为JSON字符串(
toJson()); - 判断文档是否包含对象或数组(
isObject()、isArray())。
QJsonObject:JSON对象键值对容器
QJsonObject表示JSON中的“对象”(即包裹的键值对),类似于C++中的QMap<QString, QJsonValue>,键(key)必须是字符串,值(value)可以是QJsonValue支持的任意类型(字符串、数字、布尔值、对象、数组等)。
常用方法:
- 插入/修改键值:
insert("key", value)或直接通过["key"] = value访问; - 获取值:
value("key")返回QJsonValue,需通过toVariant()、toString()等方法转换为具体类型; - 判断键是否存在:
contains("key")。
QJsonArray:JSON数组容器
QJsonArray表示JSON中的“数组”(即[]包裹的有序列表),类似于C++中的QList<QJsonValue>,元素可以是任意JSON支持的类型。
常用方法:
- 添加元素:
append(value)、insert(index, value); - 获取元素:
at(index)或[index],返回QJsonValue; - 获取数组大小:
size()。
QJsonValue:JSON值的通用表示
QJsonValue是JSON中所有可能值(字符串、数字、布尔值、对象、数组、null)的通用类,通过isString()、isDouble()、isObject()等方法判断类型,再通过toString()、toDouble()、toObject()等方法获取具体值。
JSON数据构建与序列化
从Qt对象构建JSON
假设有一个C++类User,包含用户信息,我们可以将其转换为JSON对象:
#include <QJsonObject>
#include <QJsonDocument>
struct User {
QString name;
int age;
bool isActive;
QList<QString> hobbies;
};
QJsonObject userToJson(const User &user) {
QJsonObject jsonObj;
jsonObj["name"] = user.name;
jsonObj["age"] = user.age;
jsonObj["isActive"] = user.isActive;
QJsonArray hobbiesArray;
for (const QString &hobby : user.hobbies) {
hobbiesArray.append(hobby);
}
jsonObj["hobbies"] = hobbiesArray;
return jsonObj;
}
使用示例:
User user{"Alice", 25, true, {"reading", "coding", "traveling"}};
QJsonObject jsonObj = userToJson(user);
// 转换为JSON字符串
QJsonDocument doc(jsonObj);
QString jsonString = doc.toJson(QJsonDocument::Indented); // Indented格式化输出
qDebug() << "JSON字符串:" << jsonString;
输出结果:
{
"name": "Alice",
"age": 25,
"isActive": true,
"hobbies": ["reading", "coding", "traveling"]
}
从JSON字符串解析为Qt对象
反之,我们可以将JSON字符串解析为User对象:
User jsonToUser(const QJsonObject &jsonObj) {
User user;
user.name = jsonObj["name"].toString();
user.age = jsonObj["age"].toInt();
user.isActive = jsonObj["isActive"].toBool();
QJsonArray hobbiesArray = jsonObj["hobbies"].toArray();
for (const QJsonValue &value : hobbiesArray) {
user.hobbies.append(value.toString());
}
return user;
}
使用示例:
QString jsonString = R"(
{
"name": "Bob",
"age": 30,
"isActive": false,
"hobbies": ["gaming", "music"]
}
)";
QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());
if (doc.isObject()) {
QJsonObject jsonObj = doc.object();
User user = jsonToUser(jsonObj);
qDebug() << "用户信息:" << user.name << user.age << user.isActive << user.hobbies;
}
输出结果:
用户信息: "Bob" 30 false ("gaming", "music")
复杂数据结构处理:嵌套JSON与数组
JSON的强大之处在于支持嵌套结构(对象中包含对象或数组),处理一个“用户列表”的JSON:
[
{
"id": 1,
"name": "Alice",
"address": {
"city": "Beijing",
"street": "Wangfujing"
}
},
{
"id": 2,
"name": "Bob",
"address": {
"city": "Shanghai",
"street": "Nanjing Road"
}
}
]
解析嵌套JSON
QList<User> parseUserList(const QString &jsonString) {
QList<User> userList;
QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());
if (doc.isArray()) {
QJsonArray userArray = doc.array();
for (const QJsonValue &value : userArray) {
if (value.isObject()) {
QJsonObject userObj = value.toObject();
User user;
user.name = userObj["name"].toString();
// 解析嵌套的address对象
if (userObj.contains("address")) {
QJsonObject addressObj = userObj["address"].toObject();
// 假设User类新增address字段
// user.address = addressObj["city"].toString() + ", " + addressObj["street"].toString();
}
userList.append(user);
}
}
}
return userList;
}
构建嵌套JSON
QJsonArray buildUserListJson(const QList<User> &users) {
QJsonArray userArray;
for (const User &user : users) {
QJsonObject userObj;
userObj["name"] = user.name;
QJsonObject addressObj;
addressObj["city"] = "Beijing";
addressObj["street"] = "Zhongguancun";
userObj["address"] = addressObj;
userArray.append(userObj);
}
return userArray;
}
JSON与Qt数据类型的转换
Qt提供了便捷的QVariant与JSON的互转功能,方便处理复杂数据(如自定义类型、列表等)。
从QVariant生成JSON
QVariantMap variantMap;
variantMap["name"] = "Charlie";
variantMap["age"] = 28;
variantMap["scores"] = QVariantList{90, 85, 95}; // QVariantList对应JSON数组
QJsonObject jsonObj = QJsonObject::fromVariantMap(variantMap);
QJsonDocument doc(jsonObj);
qDebug() << "QVariant转JSON:" << doc.toJson();
从JSON解析为QVariant
QString jsonString = R"({"name": "David", "age": 35, "hobbies": ["swimming", "hiking"]})";
QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());
QVariant variant = doc.toVariant();
qDebug() << "JSON转QVariant:" << variant;
// 输出: QVariant(QVariantMap, {"name": "David", "age": 35, "hobbies": ["swimming", "hiking"]})
实际应用场景
与Web服务交互(HTTP请求/响应)
通过QNetworkAccess发送HTTP请求时,常将请求数据编码为JSON,接收响应后解析JSON数据。
// 发送JSON请求 QJsonObject requestObj; requestObj["action"] = "getUserInfo"; requestObj["userId"] = 123; QJsonDocument requestDoc(requestObj); QByteArray requestData = requestDoc



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