C++ Qt开发:运用QJSON模块解析数据
温馨提示:这篇文章已超过391天没有更新,请注意相关的内容是否还可用!
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析功能。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,也易于机器解析和生成。该格式是基于JavaScript语言的一个子集,但它是一种独立于语言的数据格式,因此可以在许多不同的编程语言中使用。
该数据是以键值对的形式组织的,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象(即嵌套的键值对集合)或null,在Qt中默认提供了QJson系列类库,使用该类库可以很方便的解析和处理JSON文档。
1.1 解析单一键值对
实现解析根中的单一键值对,例如解析config.json配置文件中的blog,enable,status等这些独立的字段值,在解析之前需要先通过QJsonDocument::fromJson将内存中的字符串格式化为QJsonDocument类型,当有着该类型之后,则我们可以使用*.object()将其转换为对应的QJsonObject对象,在对象中我们可以调用各种方法对内存中的JSON数据进行处理。
以下是关于 QJsonDocument 类的一些常用方法的说明:
| 方法 | 说明 |
|---|---|
| QJsonDocument() | 构造函数,创建一个空的 JSON 文档。 |
| QJsonDocument(const QJsonObject &object) | 通过给定的 JSON 对象构造 JSON 文档。 |
| QJsonDocument(const QJsonArray &array) | 通过给定的 JSON 数组构造 JSON 文档。 |
| QJsonDocument(const QJsonValue &value) | 通过给定的 JSON 值构造 JSON 文档。 |
| QJsonDocument(const QJsonDocument &other) | 复制构造函数。 |
| QJsonDocument &operator=(const QJsonDocument &other) | 赋值运算符。 |
| bool isNull() const | 检查文档是否为空。 |
| bool isEmpty() const | 检查文档是否为空,包括 JSON 数组或对象为空的情况。 |
| QJsonObject object() const | 返回文档中的 JSON 对象。 |
| QJsonArray array() const | 返回文档中的 JSON 数组。 |
| QJsonValue value() const | 返回文档中的 JSON 值。 |
| bool isArray() const | 检查文档是否包含 JSON 数组。 |
| bool isObject() const | 检查文档是否包含 JSON 对象。 |
| QByteArray toBinaryData() const | 将文档转换为二进制数据。 |
| bool fromBinaryData(const QByteArray &data) | 从二进制数据恢复文档。 |
| QString toJson(QJsonDocument::JsonFormat format = QJsonDocument::Compact) const | 返回 JSON 字符串表示,可以选择格式化的方式。 |
| static QJsonDocument fromJson(const QString &json, QJsonParseError *error = nullptr) | 从 JSON 字符串创建文档。 |
以下是关于 QJsonObject 类的一些常用方法的说明:
| 方法 | 说明 |
|---|---|
| QJsonObject() | 构造函数,创建一个空的 JSON 对象。 |
| QJsonObject(const QJsonObject &other) | 复制构造函数。 |
| QJsonObject &operator=(const QJsonObject &other) | 赋值运算符。 |
| bool isEmpty() const | 检查对象是否为空。 |
| int size() const | 返回对象中键值对的数量。 |
| bool contains(const QString &key) const | 检查对象中是否包含指定的键。 |
| QStringList keys() const | 返回对象中所有键的列表。 |
| QJsonValue value(const QString &key) const | 返回与指定键关联的值。 |
| void insert(const QString &key, const QJsonValue &value) | 向对象中插入键值对。 |
| QJsonObject &unite(const QJsonObject &other) | 将另一个对象的键值对合并到当前对象。 |
| void remove(const QString &key) | 从对象中移除指定键及其关联的值。 |
| QJsonValue take(const QString &key) | 移除并返回与指定键关联的值。 |
| void clear() | 移除对象中的所有键值对,使其变为空对象。 |
| QJsonDocument toDocument() const | 将对象转换为 JSON 文档。 |
当需要读取参数时只需要使用find()方法查询特定字段中的key值即可,按钮on_pushButton_clicked被点击后执行如下流程;
void MainWindow::on_pushButton_clicked()
{
// 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
QMessageBox::information(nullptr,"提示","JSON格式错误",QMessageBox::Ok);
}
// 获取到Json字符串的根节点
QJsonObject root_object = root_document.object();
// 解析blog字段
QString blog = root_object.find("blog").value().toString();
//std::cout
// 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
QMessageBox::information(nullptr,"提示","JSON格式错误",QMessageBox::Ok);
}
// 获取到Json字符串的根节点
QJsonObject root_object = root_document.object();
// 解析单一对象
QJsonObject get_dict_ptr = root_object.find("GetDict").value().toObject();
QVariantMap map = get_dict_ptr.toVariantMap();
if(map.contains("address") && map.contains("username") && map.contains("password") && map.contains("update"))
{
QString address = map["address"].toString();
QString username = map["username"].toString();
QString password = map["password"].toString();
QString update = map["update"].toString();
std::cout
int ref_value = get_list_ptr.at(index).toInt();
std::cout
// 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
QMessageBox::information(nullptr,"提示","JSON格式错误",QMessageBox::Ok);
}
// 获取到Json字符串的根节点
QJsonObject root_object = root_document.object();
// 找到Object对象
QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject();
// 转为MAP映射
QVariantMap map = one_object_json.toVariantMap();
// 寻找One键
QJsonArray array_one = map["One"].toJsonArray();
for(int index=0; index 