Qt中JSON的实用指南:从解析到生成
在Qt开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其可读性强、解析效率高,被广泛应用于配置文件、网络数据传输(如API响应)、数据存储等场景,Qt内置了QJsonDocument、QJsonObject、QJsonArray等类,提供了完整的JSON处理能力,本文将详细介绍Qt中JSON的核心类、解析与生成方法,以及实际应用示例。
Qt JSON核心类概览
Qt的JSON模块位于QtJson模块(需在.pro文件中添加QT += core json),核心类包括:
QJsonValue
表示JSON中的一个值,可以是null、布尔值、整数、浮点数、字符串、数组或对象,通过isNull()、isBool()、isString()等方法判断类型,再通过toBool()、toString()等方法获取具体值。
QJsonObject
表示JSON对象,键(key)为字符串,值(value)为QJsonValue,可通过insert(key, value)添加键值对,value(key)获取指定键的值,contains(key)判断是否存在键。
QJsonArray
表示JSON数组,元素为QJsonValue,可通过append(value)、insert(index, value)添加元素,at(index)获取指定索引元素,size()获取数组长度。
QJsonDocument
用于封装QJsonObject或QJsonArray,提供JSON数据的序列化(转为字节流/字符串)和反序列化(从字节流/字符串解析为JSON对象)方法,可通过fromJson()解析JSON数据,toJson()生成JSON字节流,isObject()/isArray()判断封装的数据类型。
JSON数据的解析:从字符串到Qt对象
解析JSON数据(如从网络接收的JSON字符串或配置文件)是常见的操作,以下是具体步骤:
准备JSON字符串
假设有以下JSON数据(模拟一个用户信息对象):
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "物理", "化学"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
使用QJsonDocument解析
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QString>
void parseJsonExample() {
// 1. 准备JSON字符串(实际可能来自文件、网络等)
QString jsonString = R"(
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "物理", "化学"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
)";
// 2. 转换为QByteArray(UTF-8编码)
QByteArray jsonData = jsonString.toUtf8();
// 3. 用QJsonDocument解析
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
// 4. 检查解析是否成功(doc.isNull()表示解析失败)
if (doc.isNull()) {
qWarning() << "JSON解析失败!";
return;
}
// 5. 根据类型获取数据(假设是对象)
if (doc.isObject()) {
QJsonObject jsonObj = doc.object();
// 获取基本类型值
QString name = jsonObj.value("name").toString(); // "张三"
int age = jsonObj.value("age").toInt(); // 25
bool isStudent = jsonObj.value("isStudent").toBool(); // false
// 获取数组
QJsonArray coursesArray = jsonObj.value("courses").toArray();
QStringList courses;
for (const QJsonValue &value : coursesArray) {
courses.append(value.toString()); // ["数学", "物理", "化学"]
}
// 获取嵌套对象
QJsonObject addressObj = jsonObj.value("address").toObject();
QString city = addressObj.value("city").toString(); // "北京"
QString district = addressObj.value("district").toString(); // "海淀区"
// 输出结果
qDebug() << "姓名:" << name;
qDebug() << "年龄:" << age;
qDebug() << "是否学生:" << isStudent;
qDebug() << "课程:" << courses;
qDebug() << "地址:" << city << district;
}
}
关键点说明
- 编码问题:JSON字符串需转为
QByteArray,推荐使用toUtf8()(JSON标准为UTF-8编码)。 - 解析失败处理:若JSON格式错误(如缺少引号、括号不匹配),
fromJson()会返回null的QJsonDocument,需通过doc.isNull()判断。 - 类型安全:
QJsonValue的toXXX()方法会自动转换类型(如数字可转字符串),但需确保目标类型匹配,否则可能得到默认值(如"abc"转整数得0)。
JSON数据的生成:从Qt对象到字符串
将Qt对象(如自定义类数据)转换为JSON字符串,常用于数据存储或网络发送,以下是步骤:
构建Qt对象与JSON结构
假设有一个User类,需将其转换为JSON:
class User {
public:
QString name;
int age;
bool isStudent;
QStringList courses;
QJsonObject address; // 地址用嵌套对象表示
User(const QString &n, int a, bool s, const QStringList &c, const QJsonObject &addr)
: name(n), age(a), isStudent(s), courses(c), address(addr) {}
};
生成JSON字符串
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
void generateJsonExample() {
// 1. 准备数据(模拟User对象)
QJsonObject addrObj;
addrObj["city"] = "上海";
addrObj["district"] = "浦东新区";
User user("李四", 22, true, {"语文", "英语"}, addrObj);
// 2. 构建JSON对象
QJsonObject jsonObj;
jsonObj["name"] = user.name;
jsonObj["age"] = user.age;
jsonObj["isStudent"] = user.isStudent;
// 添加数组
QJsonArray coursesArray;
for (const QString &course : user.courses) {
coursesArray.append(course);
}
jsonObj["courses"] = coursesArray;
// 添加嵌套对象
jsonObj["address"] = user.address;
// 3. 用QJsonDocument封装
QJsonDocument doc(jsonObj);
// 若需生成紧凑格式(无多余空格),可用 QJsonDocument::Compact
// QJsonDocument doc(jsonObj, QJsonDocument::Compact);
// 4. 转换为JSON字符串
QByteArray jsonString = doc.toJson(QJsonDocument::Indented); // Indented为格式化输出(带缩进)
QString jsonStr = jsonString;
// 输出结果
qDebug() << "生成的JSON:" << jsonStr;
// 5. 保存到文件(可选)
QFile file("user.json");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
file.write(jsonString);
file.close();
qDebug() << "JSON已保存到user.json";
} else {
qWarning() << "文件打开失败!";
}
}
输出结果
{
"name": "李四",
"age": 22,
"isStudent": true,
"courses": [
"语文",
"英语"
],
"address": {
"city": "上海",
"district": "浦东新区"
}
}
关键点说明
toJson()参数:QJsonDocument::Indented用于格式化输出(便于调试),Compact为紧凑格式(节省空间)。- 嵌套结构:通过
QJsonObject嵌套表示复杂数据(如地址),QJsonArray表示列表数据(如课程)。 - 文件存储:可直接用
QFile写入JSON字节数组,注意打开模式(WriteOnly)和编码(默认UTF-8)。
实用技巧与注意事项
处理中文乱码
确保JSON字符串和文件均使用UTF-8编码:
- 字符串转
QByteArray:str.toUtf8()。 - 文件读写:用
QTextStream并指定编码(如stream.setEncoding(QStringConverter::Utf8))。
异常处理
- 解析时检查
doc.isNull(),避免访问无效数据。



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