Qt框架中的JSON操作

Qt框架中的JSON操作

  • 1 QJson库简介
  • 2 JSON 常用类
  • 3 简单的 JSON 对象
  • 4 复杂的 JSON
  • 5 QT中的json基本操作

增加调试定位信息:

qDebug()<<__FUNCTION__<<"---------------";
qDebug()<<__LINE__;

https://blog.csdn.net/penghejuan2012/article/details/82895492

https://blog.csdn.net/neochan1108/article/details/79590163

1 QJson库简介

在Qt库中,为JSON的相关操作提供了完整的类支持,包括QJsonValue,QJsonObject,QJsonArray,QJsonDocument和QJsonParseError。其中,QJsonValue类表示json格式中的一个值;QJsonObject表示一个json对象;QJsonArray顾名思义表示一个json数组;QJsonDocument主要用来读写json文档;而QJsonParseError是用来表示json解析过程中出现的错误的方便类。下面,我们就来看看这些类的详细信息。

关于 Qt 中对 JSON 的生成与解析,Qt5 以前的版本,可以使用 QJson 库,需要单独下载、编译,才能使用。到了 Qt5,提供了专门的 QJsonDocument 及其相关类来读和写 JSON 文档。

QJsonValue

QJsonValue类封装了一个json格式中的值。该值可以是如下6中基本类型:
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
一个QJsonValue可以表示上面任何一种数据类型。此外,QJsonValue还有一个特殊的标志用来表示未定义的值。可以使用isUndefined()函数来进行判断。而一个QJsonValue中存储的类型可以通过type()或isBool(),isString()之类的函数进行查询。同样,QJsonValue中存储的值可以通过toBool(),toString()等函数转换到具体的类型。

QJsonValue中存储的值在内部是强类型的,并且和QVariant相反,它不会尝试进行任何的隐式类型转换。这意味着将QJsonValue转换成一个不是它存储的类型,将返回一个该类型的模型构造函数返回的值。

其实,说到QJsonValue,还有另一个类要说,QJsonValueRef,该类是一个对于QJsonArray和QJsonObject来说的一个帮助类。当你获得一个QJsonValueRef类的对象后,你可以把它当做一个QJsonValue对象的应用来使用。如果你向他赋值,该值会实际作用到底层的QJsonArray或者QJsonObject对象中的元素上。而要想使用该类,可以使用一下的两个方法:

QJsonArray::operator[](int i)
QJsonObject::operator[](const QString& key)const;

2 JSON 常用类

QJsonDocument

QJsonDocument 类用于读和写 JSON 文档。

一个 JSON 文档可以使用 QJsonDocument::fromJson() 从基于文本的表示转化为 QJsonDocument, toJson() 则可以反向转化为文本。解析器非常快且高效,并将 JSON 转换为 Qt 使用的二进制表示。

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

如果要查询一个 JSON 文档是否包含一个数组或一个对象,使用 isArray() 和 isObject()。包含在文档中的数组或对象可以使用 array() 或 object() 检索,然后读取或操作。

也可以使用 fromBinaryData() 或 fromRawData() 从存储的二进制表示创建来 JSON 文档。

QJsonArray

QJsonArray 类封装了一个 JSON 数组。

JSON 数组是值的列表。列表可以被操作,通过从数组中插入和删除 QJsonValue 。

一个 QJsonArray 可以和一个 QVariantList 相互转换。可以使用 size() 来查询条目的数量,通过 insert() 在指定索引处插入值,removeAt() 来删除指定索引的值。

QJsonObject

QJsonObject 类封装了一个 JSON 对象。

一个 JSON 对象是一个“key/value 对”列表,key 是独一无二的字符串,value 由一个 QJsonValue 表示。

一个 QJsonObject 可以和一个 QVariantMap 相互转换。可以使用 size() 来查询“key/value 对”的数量,通过 insert() 插入“key/value 对”, remove() 删除指定的 key。

QJsonValue

QJsonValue 类封装了一个值。

JSON 中的值有 6 种基本数据类型:

  • bool(QJsonValue::Bool)
  • double(QJsonValue::Double)
  • string(QJsonValue::String)
  • array(QJsonValue::Array)
  • object(QJsonValue::Object)
  • null(QJsonValue::Null)

一个值可以由任何上述数据类型表示。此外,QJsonValue 有一个特殊的标记来表示未定义的值,可以使用 isUndefined() 查询。

值的类型可以通过 type() 或 isBool()、isString() 等访问函数查询。同样地,值可以通过 toBool()、toString() 等函数转化成相应的存储类型。

QJsonParseError

QJsonParseError 类用于在 JSON 解析中报告错误。

枚举 QJsonParseError::ParseError:

该枚举描述 JSON 文档在解析过程中所发生的错误类型。
Qt框架中的JSON操作_第1张图片

3 简单的 JSON 对象

构造一个简单的 JSON 对象:

{
     
    "Cross Platform": true,
    "From": 1991,
    "Name": "Qt"
}

生成比较简单,由于是一个对象,只需要用 QJsonObject 即可。

// 构建 JSON 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("From", 1991);
json.insert("Cross Platform", true);
 
// 构建 JSON 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
 
qDebug() << strJson;

解析如下:

QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
       // 解析未发生错误
    if (doucment.isObject()) {
      // JSON 文档为对象
        QJsonObject object = doucment.object();  // 转化为对象
        if (object.contains("Name")) {
       // 包含指定的 key
            QJsonValue value = object.value("Name");  // 获取指定 key 对应的 value
            if (value.isString()) {
       // 判断 value 是否为字符串
                QString strName = value.toString();  // 将 value 转化为字符串
                qDebug() << "Name : " << strName;
            }
        }
        if (object.contains("From")) {
     
            QJsonValue value = object.value("From");
            if (value.isDouble()) {
     
                int nFrom = value.toVariant().toInt();
                qDebug() << "From : " << nFrom;
            }
        }
        if (object.contains("Cross Platform")) {
     
            QJsonValue value = object.value("Cross Platform");
            if (value.isBool()) {
     
                bool bCrossPlatform = value.toBool();
                qDebug() << "CrossPlatform : " << bCrossPlatform;
            }
        }
    }
}

4 复杂的 JSON

构造一个复杂的 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
    ]
}

包含了一个拥有五个“key/value 对”的对象,values 中的两个(Company、Name)是字符串,一个(From)是数字,一个(Page)是对象,一个(Version)是数组。

要生成这样一个复杂的 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;

解析部分其实并没有看起来这么复杂,只要一步步搞明白对应的类型,然后进行相应转化即可。

QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
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;
                    }
                }
            }
        }
    }
}

基本的用法就这些,比较简单,细节很关键,建议在处理的过程中启用严格模式,例如:先通过 QJsonParseError::NoError 判断转化 JSON 文档无误,再进行解析。在解析过程中,先判断 QJsonValue 是否为对应的类型如 isObject(),再通过 toObject() 转化。

5 QT中的json基本操作

// json对象类
QJsonObject
// json数组
QJsonArray
// 封装了json支持的数据类型
QJsonValue
// 将json字符串 -> json数组, json对象 [数据从字符串到了内存对象中, 方便对数据进行操作]
// 将json数组, json对象(内存) -> 字符串 [数据传输/写磁盘]
QJsonDocument

QJsonValue

// 1. 构造函数, 包装数据
// 2. 类型的判断函数
bool isxx();
// 3. 转换函数
xxx toxxx();

QJsonObject

// 向json对象中添加数据
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);
// 返回当前对象中所有的键值,只包含顶层键值,不含子级别键值
// QStringList == QLsit
QStringList QJsonObject::keys() const;
// 根据key取出value值
QJsonValue QJsonObject::value(const QString &key) const;
QJsonValue QJsonObject::operator[](const QString &key) const;

QJsonArray

// 在尾部添加数据
void QJsonArray::append(const QJsonValue &value);
void QJsonArray::push_back(const QJsonValue &value);
// 添加到数组头部
void QJsonArray::prepend(const QJsonValue &value);
void QJsonArray::push_front(const QJsonValue &value);
// 插入
void QJsonArray::insert(int i, const QJsonValue &value);
// 替换
void QJsonArray::replace(int i, const QJsonValue &value);
// 访问i位置的元素
QJsonValue QJsonArray::at(int i) const;
// 通过[]访问元素
QJsonValueRef QJsonArray::operator[](int i);

QJsonDocument

// 将json字符串 -> json数组, json对象 [数据从字符串到了内存对象中, 方便对数据进行操作]
// 读磁盘文件
QFile file("test.json");
file.open(IODevice::ReadOnly);
QByteArray json = file.readAll();
file.close();

// 读文件
file.
// 通过一个json字符串 得到一个json文档对象
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

// 判断文档对象中保存的数据是数组 or 对象类型
bool QJsonDocument::isArray() const;
bool QJsonDocument::isObject() const
    
// 将QJsonDocument对象转换为json数组或对象
QJsonArray QJsonDocument::array() const;
QJsonObject QJsonDocument::object() const
// 将json数组, json对象(内存) -> 字符串 [数据传输/写磁盘]
// 创建json对象/数组
QJsonArray::QJsonArray();
QJsonObject::QJsonObject();

// 将数据添加到数组或对象中
// 参数上边的api


// 将json数组, json对象 -> 文档对象
QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);

// 将json文档对象中的数组/object -> 序列化 -> 字符串
// 返回值是文本类型
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;
// 返回值: 二进制字符串
QByteArray QJsonDocument::toBinaryData() const;

// 字符串写文件
QFile
ofstream
fopen
open

原文链接:
https://blog.csdn.net/Dxs4396/article/details/104145472?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242.2

https://www.bejson.com/jsoneditoronline/

你可能感兴趣的:(Qt经验总结,qt,json,开发语言)