C++ Qt开发:运用QJSON模块解析数据
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
还没有评论,来说两句吧...