Qt框架中Json模块的快速上手

这篇博客主要介绍Qt框架下的Json模块的使用

注:Json模块已经嵌入到QCore中,无需引入其他模块

需要使用的对象

QJsonDocument

这是Qt提供的一个用来序列化以及反序列化Json文本的类

QJsonDocument(const QJsonObject &*object*)

QJsonDocument常用的构造函数,会将传入的QJsonObject设置成主对象

fromJson(const QByteArray &json, QJsonParseError error = nullptr)

fromJson函数解析UTF-8编码的Json文本,并创建一个QJsonDocument对方返回,如果解析失败将会返回空值

object()

返回一个QJsonObject,如果文档为数组则返回空值

setObject(const QJsonObject &object)

将传入的QJsonObject设置成主对象,也就是Json文本的根对象

toJson(QJsonDocument::JsonFormat *format* = Indented) const

将存储在对象中的数据序列化为Json文本,需要传入一个变量,来确定转换之后的风格

QJsonDocument::Indented 可读模式,这个是有缩进的风格也就是下文会给出的Json文本的风格

QJsonDocument::Compact 紧凑模式,这个风格没有缩进是紧凑风格,一般用来减少占用使用

QJsonObject

operator[](QString &key)

对应键值存在就返回对应的QJsonValueRef,如果不存在就创建新的键,将新的值与其关联起来

take(const QString &key)

对应键值存在就返回对应的QJsonValue并且在QJsonObject中删除该键,不存在就返回一个null

value(const QString &key) const

对应键值存在便返回对应的QJsonValue,不存在就返回一个默认值,不会引发错误

insert(const QString &key, const QJsonValue &value)

传入的第一个变量为键,第二个变量是其对应的变量

erase(QJsonObject::iterator it)

擦除传入的迭代器指向的键值,并返回下一个对应的键值

QJsonValue

isInt()

如果值包含int类型则返回true,其他的函数同理

toInt(int defaultValue = 0) const

如果值为int or double类型便返回,如果值不是便返回defaultValue

其他to函数如果类型对应不上便返回defaultValue

toObject、toString、toArray如果不传入defaultValue便返回其无参构造函数构造的值

QJsonArray

这个比较好理解你只需要将其想成一个存放着QJsonValue的数组就可以了

at(qsizetype *i*) const

返回对应索引位置的元素,i的值必须是有效索引位置(0<=i<size)

takeAt(qsizetype i)

删除对应索引位置的元素并将其返回,i的值必须是有效索引位置

removeAt(qsizetype i)

同上但是不返回任何值

append(const QJsonValue &value)

将值插入到数组的末尾

示例解析

反序列化示例

我将给出一段代码,目的是反序列化这段Json文本

{
    "Text":"Hello Qt Json module",
    "Array":[
        {
            "ObjectName":"QWidget",
            "Widget":1920,
            "High":1080,
            "Hide":true
        },
        {
            "ObjectName":"QLable",
            "Widget": 114,
            "High":514,
            "Hide":false
        }
    ]
}

这段代码反序列化了上面的Json文本并将存在里面的值输出了出来

#include <QtCore/QCoreApplication>
#include <QJsonArray>
#include <QJsonObject>
#include <QFile>
#include <QJsonDocument>
#include <QJsonValue>
int main(int argc, char* argv[]) {
 QCoreApplication a(argc, argv);
 QFile file("test.json");
 file.open(QIODeviceBase::ReadOnly);
 QJsonDocument document = QJsonDocument::fromJson(file.readAll());
 qDebug() << document.object()["Text"].toString();
 QJsonArray array = document.object()["Array"].toArray();
 for (auto item : array) {
  qDebug() << item.toObject()["ObjectName"].toString();
  qDebug() << item.toObject()["Widget"].toDouble();
  qDebug() << item.toObject()["High"].toDouble();
  qDebug() << item.toObject()["Hide"].toBool();
 }
 return a.exec();
}

接下来逐步解析一下

初始化file,设置文件名字为test.json

使用只读模式打开test.json文件

将test.json中的文本反序列化成QJsonDocument

QFile file("test.json");
file.open(QIODeviceBase::ReadOnly);
QJsonDocument document = QJsonDocument::fromJson(file.readAll());

读取Text键的值,将其转换成QString类型并输出

qDebug() << document.object()["Text"].toString();

读取Array键的值,将其转换成QJsonArray类型并赋值给array对象

QJsonArray array = document.object()["Array"].toArray();

使用for基于范围遍历array中的值,并输出item的值

for (auto item : array) {
 qDebug() << item.toObject()["ObjectName"].toString();
 qDebug() << item.toObject()["Widget"].toDouble();
 qDebug() << item.toObject()["High"].toDouble();
 qDebug() << item.toObject()["Hide"].toBool();
}

这便是一个简单的使用Qt框架中的Json模块反序列化的示例

序列化示例

这段代码生成了一段Json文本并写入了test.json文件中

#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QtCore/QCoreApplication>
int main(int argc, char* argv[]) {
  QCoreApplication a(argc, argv);
  QFile file("test.json");
  QJsonDocument document;
  QJsonObject jsonObject;
  QJsonArray array;
  file.open(QIODeviceBase::WriteOnly);
  QJsonValue value1("Hello World");
  jsonObject.insert("WelcomeText", value1);
  array.append(QJsonValue("ObjectName = Name"));
  array.append(QJsonValue("Hei!"));
  jsonObject.insert("Array", array);
  document.setObject(jsonObject);
  file.write(document.toJson(QJsonDocument::Indented));
  file.close();
  return a.exec();
}

初始化需要的变量,设置file的文件名为test.json

QFile file("test.json");
QJsonDocument document;
QJsonObject jsonObject;

使用只写模式打开

file.open(QIODeviceBase::WriteOnly);

构造一个QJsonValue并将其插入jsonObject中

QJsonValue value1("Hello World");
jsonObject.insert("WelcomeText", value1);

向array的尾部追加两个QJsonValue并插入到jsonObject中

array.append(QJsonValue("ObjectName = Name"));
array.append(QJsonValue("Hei!"));
jsonObject.insert("Array", array);

将jsonObject设置为document的主对象

将toJson使用Indented风格序列化出来的Json文本写入test.json文件中

并关闭test.json文件

document.setObject(jsonObject);
file.write(document.toJson(QJsonDocument::Indented));
file.close();

这段代码运行后会生成一个test.json文件,文件中内容为

{
    "Array": [
        "ObjectName = Name",
        "Hei!"
    ],
    "WelcomeText": "Hello World"
}

最后来首音乐放松一下吧

感兴趣的可以看看我的博客:博客地址

Qt提供了QJsonDocument、QJsonObject、QJsonArray等类,可以方便地对JSON数据进行解析、生成和操作。 下面是一个简单的例子,演示如何使用QtJSON模块解析一个JSON字符串: ```c++ #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDebug> int main() { QString jsonStr = "{\"name\":\"Alice\", \"age\":20, \"scores\":[85, 90, 95]}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8()); if(jsonDoc.isNull()){ qWarning() << "Parse failed"; return -1; } if(jsonDoc.isObject()){ QJsonObject jsonObj = jsonDoc.object(); if(jsonObj.contains("name") && jsonObj["name"].isString()){ QString name = jsonObj["name"].toString(); qDebug() << "name:" << name; } if(jsonObj.contains("age") && jsonObj["age"].isDouble()){ int age = jsonObj["age"].toInt(); qDebug() << "age:" << age; } if(jsonObj.contains("scores") && jsonObj["scores"].isArray()){ QJsonArray scoresArray = jsonObj["scores"].toArray(); qDebug() << "scores:"; for(int i = 0; i < scoresArray.size(); i++){ if(scoresArray[i].isDouble()){ int score = scoresArray[i].toInt(); qDebug() << score; } } } } return 0; } ``` 在上面的例子,首先定义了一个JSON格式的字符串jsonStr,然后使用QJsonDocument::fromJson()函数将其解析为一个QJsonDocument对象。 接着,使用QJsonDocument对象的成员函数来判断该JSON数据的类型,并进行相应的解析操作。如果是一个JSON对象,则调用QJsonObject对象的成员函数来获取其的值。 需要注意的是,在解析JSON数据时,需要先判断该值是否存在并且是否是正确的类型,才能进行相应的操作,否则会导致程序崩溃或数据不正确。 除了解析JSON数据之外,QtJSON模块还可以用于生成JSON数据和操作JSON数据,具体用法可以参考Qt的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值