Qt中QJsonDocument 类
创始人
2024-02-11 08:16:05

01. QJsonDocument类简介
Header:    #include
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;
                    }
                }
            }
        }
    }
}
 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...