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
暂无评论内容