【Qt】Qt中QJsonDocument 类

00. 目录

01. QJsonDocument类简介

Header:	#include <QJsonDocument>
qmake:	QT += core
Since:	Qt 5.0

​ QJsonDocument提供了读写Json文档的方法。

​ QJsonDocument是一个包含了完整JSON文档的类,支持以UTF-8编码的文本和QT自身的二进制格式来读写JSON文档。

​ JSON文档可以使用QJsonDocument::fromJson()将基于JSON文档的文本形式转换为QJsonDocument对象,toJSON()可以将QJsonDocument转换回文本形式。

​ 解析文档的有效性可以使用 !isNull() 进行查询。

​ 使用isArray()和isObject()可以分别查询一个文档是否包含了一个数组或一个object。使用array()或object()可以将包含在文档中的数组或object提取出来。

​ 使用fromBinaryData()或fromRawData()也可以从一个二进制形式创建一个QJsonDocument对象。

02. 公有类型

enum DataValidation { Validate, BypassValidation }
enum JsonFormat { Indented, Compact }

03. 公有成员方法

QJsonDocument()
QJsonDocument(const QJsonObject &object)
QJsonDocument(const QJsonArray &array)
QJsonDocument(const QJsonDocument &other)
QJsonDocument(QJsonDocument &&other)
~QJsonDocument()
QJsonArray	array() const
bool	isArray() const
bool	isEmpty() const
bool	isNull() const
bool	isObject() const
QJsonObject	object() const
const char *	rawData(int *size) const
void	setArray(const QJsonArray &array)
void	setObject(const QJsonObject &object)
void	swap(QJsonDocument &other)
QByteArray	toBinaryData() const
QByteArray	toJson() const
QByteArray	toJson(QJsonDocument::JsonFormat format) const
QVariant	toVariant() const
bool	operator!=(const QJsonDocument &other) const
QJsonDocument &	operator=(const QJsonDocument &other)
QJsonDocument &	operator=(QJsonDocument &&other)
bool	operator==(const QJsonDocument &other) const
const QJsonValue	operator[](const QString &key) const
const QJsonValue	operator[](QLatin1String key) const
const QJsonValue	operator[](int i) const

成员方法解析

[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
Validation决定数据是否在使用前检查数据有效性。

[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)
将json解析为UTF-8的JSON文档

[static] QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation = Validate)
使用data数据的前size字节创建一个QJsonDocument对象

[static] QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)
根据variant创建QJsonDocument对象

bool QJsonDocument::isArray() const

bool QJsonDocument::isEmpty() const

bool QJsonDocument::isNull() const

bool QJsonDocument::isObject() const

QJsonObject QJsonDocument::object() const
返回文档中包含的QJsonObject对象

const char *QJsonDocument::rawData(int *size) const
返回size大小的二进制数据

void QJsonDocument::setArray(const QJsonArray &array)
设置array作为文档中的主对象

void QJsonDocument::setObject(const QJsonObject &object)
设置object作为文档中的主对象

QByteArray QJsonDocument::toBinaryData() const
返回文档的二进制格式数据

QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const
将QJsonDocument转换为UTF-8编码的format格式的JSON文档

QVariant QJsonDocument::toVariant() const
返回JSON文档的QVariant格式

04. 静态公有成员

const uint	BinaryFormatTag
QJsonDocument	fromBinaryData(const QByteArray &data, QJsonDocument::DataValidation validation = Validate)
QJsonDocument	fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
QJsonDocument	fromRawData(const char *data, int size, QJsonDocument::DataValidation validation = Validate)
QJsonDocument	fromVariant(const QVariant &variant)

05. 复杂Json生成和解析

5.1 复杂Json

{
    "Company": "Digia",
    "From": 1991,
    "Name": "Qt",
    "Page": {
        "Developers": "https://www.qt.io/developers/",
        "Download": "https://www.qt.io/download/",
        "Home": "https://www.qt.io/"
    },
    "Version": [
        4.8,
        5.2,
        5.7
    ]
}

5.2 复杂Json生成

// 构建 Json 数组 - Version
QJsonArray versionArray;
versionArray.append(4.8);
versionArray.append(5.2);
versionArray.append(5.7);

// 构建 Json 对象 - Page
QJsonObject pageObject;
pageObject.insert("Home", "https://www.qt.io/");
pageObject.insert("Download", "https://www.qt.io/download/");
pageObject.insert("Developers", "https://www.qt.io/developers/");

// 构建 Json 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("Company", "Digia");
json.insert("From", 1991);
json.insert("Version", QJsonValue(versionArray));
json.insert("Page", QJsonValue(pageObject));

// 构建 Json 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);

qDebug() << strJson;

5.3 复杂Json解析

QJsonParseError jsonError;
// 转化为 JSON 文档
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) 
{  
    // 解析未发生错误
    if (doucment.isObject()) 
    {  
        // JSON 文档为对象
        QJsonObject object = doucment.object();  // 转化为对象
        if (object.contains("Name")) 
        {
            QJsonValue value = object.value("Name");
            if (value.isString()) {
                QString strName = value.toString();
                qDebug() << "Name : " << strName;
            }
        }
        if (object.contains("Company")) 
        {
            QJsonValue value = object.value("Company");
            if (value.isString()) 
            {
                QString strCompany = value.toString();
                qDebug() << "Company : " << strCompany;
            }
        }
        if (object.contains("From")) 
        {
            QJsonValue value = object.value("From");
            if (value.isDouble()) 
            {
                int nFrom = value.toVariant().toInt();
                qDebug() << "From : " << nFrom;
            }
        }
        if (object.contains("Version")) 
        {
            QJsonValue value = object.value("Version");
            if (value.isArray()) {  // Version 的 value 是数组
                QJsonArray array = value.toArray();
                int nSize = array.size();
                for (int i = 0; i < nSize; ++i) 
                {
                    QJsonValue value = array.at(i);
                    if (value.isDouble()) 
                    {
                        double dVersion = value.toDouble();
                        qDebug() << "Version : " << dVersion;
                    }
                }
            }
        }
        if (object.contains("Page")) 
        {
            QJsonValue value = object.value("Page");
            if (value.isObject()) 
            {  // Page 的 value 是对象
                QJsonObject obj = value.toObject();
                if (obj.contains("Home")) 
                {
                    QJsonValue value = obj.value("Home");
                    if (value.isString()) 
                    {
                        QString strHome = value.toString();
                        qDebug() << "Home : " << strHome;
                    }
                }
                if (obj.contains("Download")) 
                {
                    QJsonValue value = obj.value("Download");
                    if (value.isString()) 
                    {
                        QString strDownload = value.toString();
                        qDebug() << "Download : " << strDownload;
                    }
                }
                if (obj.contains("Developers")) 
                {
                    QJsonValue value = obj.value("Developers");
                    if (value.isString()) 
                    {
                        QString strDevelopers = value.toString();
                        qDebug() << "Developers : " << strDevelopers;
                    }
                }
            }
        }
    }
}

06. 附录

官方参考文档

© 版权声明
THE END
喜欢就支持一下吧
点赞770 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容