Qt之JSON相关类介绍
-
- QJsonDocument
- QJsonObject
- QJsonArray
-
- 常用函数
- QJsonArray与QVariantList相互转换
-
- [将 QJsonArray 转换为 QVariantList:](#将 QJsonArray 转换为 QVariantList:)
- [将 QVariantList 转换为 QJsonArray:](#将 QVariantList 转换为 QJsonArray:)
QJsonDocument
QJsonDocument
类提供了一种读取和写入JSON
文档的方式。
QJsonDocument
是一个包装完整JSON
文档的类,可以从以UTF-8
编码的文本表示形式以及Qt自身的二进制格式读取和写入该文档。
可以使用QJsonDocument::fromJson()
将基于文本的表示转换为QJsonDocument.toJson()
将其转换回文本。解析器非常快速和高效,并将JSON转换为Qt使用的二进制表示形式。
可以使用!isNull()查询已解析文档的有效性。
可以使用isArray()
和isObject()
查询文档是否包含数组或对象。可以使用array()
或object()
检索文档中包含的数组或对象,然后进行读取或操作。
还可以使用fromBinaryData()
或fromRawData()
从存储的二进制表示创建文档。
成员类型文档
常用函数
枚举类型 QJsonDocument::DataValidation
此值用于告诉 QJsonDocument
在使用fromBinaryData()
或 fromRawData()
将数据转换为QJsonDocument
时是否验证二进制数据。
常量 | 值 | 描述 |
---|---|---|
QJsonDocument::Validate | 0 | 在使用数据之前对其进行验证。这是默认值。 |
QJsonDocument::BypassValidation | 1 | 绕过数据验证。只有当您从可信来源收到数据并知道其有效时才使用,因为使用无效数据可能会导致应用程序崩溃。 |
枚举类型 QJsonDocument::JsonFormat
此值将数据转换为 QJsonDocument 时生成的 JSON 字节数组的格式。
常量 | 值 | 描述 |
---|---|---|
QJsonDocument::Indented | 0 | 定义可读性强的输出,如下所示: |
QJsonDocumentCompact | 1 | 定义紧凑的输出,如下所示: |
QJsonDocument::Indented
格式
cpp
{
"Array": [
true,
999,
string"
],
"Key": "Value",
"null": null
}
QJsonDocumentCompact
格式
cpp
{"Array":[true,999,"string"],"Key":"Value","null":null}
构造函数
QJsonDocument()
:默认构造函数,创建一个空的JSON文档。QJsonDocument(const QJsonObject& object)
:使用给定的QJsonObject对象创建一个JSON文档。QJsonDocument(const QJsonArray& array)
:使用给定的QJsonArray对象创建一个JSON文档。
静态函数
QJsonDocument::fromJson(const QByteArray& json)
:将指定的JSON表示形式转换为QJsonDocument对象。QJsonDocument::fromVariant(const QVariant& variant)
:将给定的QVariant对象转换为QJsonDocument对象。QJsonDocument::fromBinaryData(const QByteArray& data, QJsonDocument::DataValidation validation = QJsonDocument::Validate)
:从二进制数据创建一个QJsonDocument对象,并可选择是否验证数据。QJsonDocument::fromRawData(const char* data, int size, QJsonDocument::DataValidation validation = QJsonDocument::Validate)
:从原始二进制数据创建一个QJsonDocument对象,并可选择验证数据。
成员函数
- QJsonDocument::toJson(QJsonDocument::JsonFormat format = QJsonDocument::Indented)`:将QJsonDocument对象转换为JSON表示形式的字节数组。
- QJsonDocument::toVariant()`:将QJsonDocument对象转换为QVariant对象。
- QJsonDocument::isEmpty()`:检查JSON文档是否为空。
- QJsonDocument::isNull()`:检查JSON文档是否为null。
QJsonDocument::isArray()
:检查JSON文档是否为数组。QJsonDocument::isObject()
:检查JSON文档是否为对象。QJsonDocument::array()
:获取JSON文档中的数组。QJsonDocument::object()
:获取JSON文档中的对象。
示例
cpp
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个JSON文档
QJsonObject object;
object["name"] = "John Doe";
object["age"] = 25;
QJsonArray hobbies;
hobbies.append("reading");
hobbies.append("music");
object["hobbies"] = hobbies;
QJsonDocument doc(object);
// 将JSON文档转换为字符串表示形式
QByteArray jsonBytes = doc.toJson(QJsonDocument::Indented);
QString jsonString = QString::fromUtf8(jsonBytes);
qDebug() << "JSON Document:" << jsonString;
// 解析JSON文档
QJsonDocument parsedDoc = QJsonDocument::fromJson(jsonBytes);
if(parsedDoc.isNull()){
qDebug() << "Failed to parse JSON document.";
return 0;
}
// 检查JSON文档是否为对象
if(parsedDoc.isObject()){
QJsonObject parsedObject = parsedDoc.object();
qDebug() << "Parsed JSON Object:";
qDebug() << "Name:" << parsedObject["name"].toString();
qDebug() << "Age:" << parsedObject["age"].toInt();
qDebug() << "Hobbies:";
QJsonArray parsedHobbies = parsedObject["hobbies"].toArray();
for(const auto& hobby : parsedHobbies){
qDebug() << " -" << hobby.toString();
}
} else {
qDebug() << "Parsed JSON document is not an object.";
return 1;
}
return a.exec();
}
在示例中,创建了一个JSON文档,其中含了一个包含姓名年龄和兴趣爱好的对象。
然后,将该对象转换为JSON字符串表示形式,并输出到控制台。
接下来,使用QJsonDocument::fromJson()函数解析该JSON字符串,将其转换为QJsonDocument对象。
最后,检查解析的JSON文档是否为对象,并打印出对象中的值。
示例展示了使用QJsonDocument类创建和解析JSON文档。可以根据需求修改和扩展代码。请注意,示例中使用了Qt应用程序和处理事件循环。如果在不使用Qt框架的环境中使用QJsonDocument,需要相应地修改代码。
QJsonObject
QJsonObject
类封装了一个JSON
对象。JSON
对象是一个键值对列表,其中键是唯一的字符串,值由QJsonValue
表示。QJsonObject
可以与 QVariantMap
相互转换。您可以使用size()
查询(键,值)对的数量,使用insert()
和remove()
从中插入和删除条目,并使用标准的 C++ 迭代器模式遍历其内容。QJsonObject
是一个隐式共享类,只要不进行修改,它就会与创建它的文档共享数据。您可以通过QJsonDocument
将对象从基于文本的 JSON 转换出来和转换进去。
常用函数
构造函数:
QJsonObject()
:默认构造函数,创建一个空的JSON对象。QJsonObject(const QJsonObject &other)
:拷贝构造函数,根据另一个JSON对象创建一个新的JSON对象。
成员函数:
bool isEmpty() const
:判断JSON对象是否为空,如果对象中不包含任何属性,则返回true
,否则返回false
。int size() const
:返回JSON对象中属性的数量。bool contains(const QString &key) const
:检查JSON对象中是否包含指定键。void insert(const QString &key, const QJsonValue &value)
:向JSON对象中插入一个键值对。void remove(const QString &key)
:从JSON对象中移除指定键的属性。QJsonValue value(const QString &key) const
:返回指定键对应的值。如果键不存在,则返回QJsonValue()
。QStringList keys() const
:返回JSON对象中所有键的列表。QJsonObject &operator=(const Q &other)
:赋值运算符,将另一个JSON对象属性复制到当前对象中。QJsonValue operator[](const QString &key) const
:通过键访问JSON对象的属性值。
通过这些构造函数和成员函数,可以创建JSON对象、添加、移除和访问对象的属性值,并操作以及获取对象的相关信息。这些函数提供了便捷的方式来处理和操作JSON对象。
QJsonObject 与 QVariantMap 相互转换
在C++中,可以使用QJsonObject
和QVariantMap
之间的fromVariant()
和toVariant()
两个函数来实现相互转换。下面是一个示例:
cpp
#include <QCoreApplication>
#include <QJsonObject>
#include <QVariantMap>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个QJsonObject
QJsonObject jsonObject;
jsonObject["name"] = "John Doe";
jsonObject["age"] = 25;
jsonObject["isEmployed"] = true;
// 将QJsonObject转换为QVariantMap
QVariantMap variantMap = jsonObject.toVariantMap();
// 输出转换后的QVariantMap内容
qDebug() << "QVariantMap:";
qDebug() << "Name:" << variantMap["name"].toString();
qDebug() << "Age:" << variantMap["age"].toInt();
qDebug() << "Is Employed:" << variantMap["isEmployed"].toBool();
// 创建一个QVariantMap
QVariantMap newVariantMap;
newVariantMap["name"] = "Jane Smith";
newVariantMap["age"] = 30;
newVariantMap["isEmployed"] = false;
// 将QVariantMap转换为QJsonObject
QJsonObject newJsonObject = QJsonObject::fromVariantMap(newVariantMap);
// 输出转换后的QJsonObject内容
qDebug() << "QJsonObject:";
qDebug() << "Name:" << newJsonObject["name"].toString();
qDebug() << "Age:" << newJsonObject["age"].toInt();
qDebug() << "Is Employed:" << newJsonObject["isEmployed"].toBool();
return a.exec();
}
在上述示例中,创建了一个QJsonObject
对象jsonObject
,并为其添加了一些键值对。
然后,使用toVariantMap()
函数将其转换为QVariantMap
对象variantMap
,并输出其内容。
接下来,创建了一个新的QVariantMap
对象newVariantMap
,并为其添加了一些键值对。
最后,使用QJsonObject
的fromVariantMap()
函数将newVariantMap
转换回QJsonObject
对象newJsonObject
,并输出其内容。
通过toVariantMap()
和fromVariantMap()
函数,可以方便地在QJsonObject
和QVariantMap
之间进行转换,并且可以在转换后访问和操作数据。这些函数是互相转换的,可以根据需要在QJsonObject
和QVariantMap
之间进行双向转
QJsonArray
QJsonArray
类封装了一个JSON数组。
QJsonArray可以与QVariantList相互转换。可以使用size()、insert()和removeAt()来查询数组中的条目数量,并使用标准的C++迭代器模式遍历其内容。
QJsonArray是一个隐式共享的类,并且只要它没有被修改,就与其创建的文档共享数据。
可以通过QJsonDocument将数组转换为基于文本的JSON,也可以将文本转换为数组。
常用函数
QJsonArray
是Qt框架中的一个类,用于表示JSON数组。它提供了一组构造函数和一些常用的成员函数,用于创建、操作和访问JSON数组的元素。下面是QJsonArray
的构造函数和一些常用成员函数介绍:
构造函数:
QJsonArray()
:默认构造函数,创建一个空的JSON数组QJsonArray(const QJsonArray &other)
:拷贝构造函数,根据另一个JSON数组创建一个新的JSON数组。QJsonArray(std::initializer_list<QJsonValue> list)
:使用初始化列表创建一个新的JSON数组。
成员函数:
bool isEmpty() const
:判断JSON数组是否为空,如果数组中不包含任何元素,则返回true
,否则返回``。int size() const
:返回JSON数组中元素的数量。void append(const QJsonValue &value)
:向JSON数组末尾添加一个元素。void prepend(const QJsonValue &value)
:在JSON数组开头插入一个元素。void insert(int index, const QJsonValue &value)
:在指定位置插入一个元素。void removeAt(int index)
:移除指定位置的元素。QJsonValue at(int index) const
:返回指定位置的元素。QJsonValue operator[](int index) const
:通过索引访问JSON数组的元素。void replace(int index, const QJsonValue &value)
:替换指定位置的元素。QVariantList toVariantList() const
:将JSON数组转换为QVariantList。QString toJson(QDocument::JsonFormat format = QJsonDocument::Indented) const
:将JSON数组转换为文本形式的JSON。
通过这些构造函数和成员函数,可以创建JSON数组、添加、移除和访数组的元素,并操作以及获取数组的相关信息。
QJsonArray与QVariantList相互转换
以下是将 QJsonArray 转换为 QVariantList 和将 QVariantList 转换为 QJsonArray 相互转换示例。
将 QJsonArray 转换为 QVariantList:
cpp
QJsonArray jsonArray;
jsonArray.append(10);
jsonArray.append("Hello");
jsonArray.append(false);
QVariantList variantList = jsonArray.toVariantList();
在示例中,创建一个 QJsonArray 对象 jsonArray,然后向其中添加一些元素。使用 jsonArray 的 toVariantList() 函数将其转换为 QVariantList 对象 variantList。
将 QVariantList 转换为 QJsonArray:
cpp
QVariantList variantList;
variantList << 10 << "Hello" << false;
QJsonArray jsonArray = QJsonArray::fromVariantList(variantList);
在示例中,创建一个 QVariantList 对象 variantList,并向其中添加一些元素。然后,使用 QJsonArray 的静态函数 fromVariantList() 将 variantList 转换为 QJsonArray 对象 jsonArray。
通过这些示例,可以在 QJsonArray 和 QVariantList 之间进行双向转换,方便地在 JSON 数据和 QVariant 数据之间进行处理和传递。