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() 等函数转化成相应的存储类型。
简单的 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);
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
if (doucment.isObject()) {
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("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;
- 注意:在转化为 QJsonDocument 后,首先需要根据 QJsonParseError 的值判定是否转化成功,然后在进行相应的转化解析。
简单的 JSON 数组
构造一个简单的 JSON 对象:
"Qt",
5.7,
- 生成比较简单,由于是一个数组,只需要用 QJsonArray 即可。
QJsonArray json;
json.append("Qt");
json.append(5.7);
json.append(true);
QJsonDocument document;
document.setArray(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
qDebug() << strJson;
- 需要注意的是,和上面不同的是,这里使用的是 QJsonDocument 的 setArray() 函数,因为是数组嘛!
解析如下:
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
if (doucment.isArray()) {
QJsonArray array = doucment.array();
int nSize = array.size();
for (int i = 0; i < nSize; ++i) {
QJsonValue value = array.at(i);
if (value.type() == QJsonValue::String) {
QString strName = value.toString();
qDebug() << strName;
if (value.type() == QJsonValue::Double) {
double dVersion = value.toDouble();
qDebug() << dVersion;
if (value.type() == QJsonValue::Bool) {
bool bCrossPlatform = value.toBool();
qDebug() << bCrossPlatform;
- 和 JSON 对象类似,在遍历数组时,获取每个 value,首先需要判断 value 的类型(和 is***() 函数类似,这里根据 type() 函数返回的枚举值来判断),然后再进行相应的转换。
复杂的 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,
- 包含了一个拥有五个“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);
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
if (doucment.isObject()) {
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()) {
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()) {
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() 转化。
转自: https://blog.csdn.net/liang19890820/article/details/52767153
qt解析json的数据,需要使用的类有qjsonobject,qjsonarray,qjsondocument。
qjsondocument是用于读取或者写入json文件
qjsonarray是封装一个json数组
qjsonobject是封装一个json对象
要解析json,就需要先了解你需要解析的json格式,然后在写对应的解析代码。
例如这样的一份json文件,我现在想要解析他。将文件中每一个值都进行输出。
解析json就像扒洋葱一样,一层一层的往下扒。我们可以看到第一层是一个array。
Qt支持处理JSON数据。JSON是一种对源自Javascript的对象数据进行编码的格式,但现在被广泛用作互联网上的数据交换格式。Qt中的JSON支持提供了一个易于使用的C++API来解析、修改和保存JSON数据。它还支持以二进制格式保存数据,这种格式可以直接“mmap”,并且访问速度非常快。JSON数据格式的更多详细信息可以在JSON中找到。
https://www.json.org/json-en.html和RFC-4627
中https://www.rfc-editor.org/rfc/rfc462
3、Json数组
Json数组使用[]表示,[]里面是元素,元素间使用 , 分隔,最后一个元素后面,没有 ,
一个Json数组,支持多种不同的数据类型,包括:整形,浮点型,字符串,json数组,json对象,空值-null(null)
Json数组中嵌套Json数组,父子关系
Json数组嵌套Js
QJsonDoucument
它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档。
QJsonArray
JSON 数组是一个值列表。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
QJsonObject
JSON 对象是键值对的列表,其中键是唯一的字符串,值由 QJs
Qt之JSON生成与解析
Qt5中包含了处理JSON的类,均以QJson开头(例如:QJsonDocument、QJsonArray、QJsonObject),在QtCore模块中,不需要额外引入其它模块。
常用的 JSON 库
json.org 中介绍了 JSON 在各种语言中的应用,在 C/C++ 中比较常用的JSON 库主要有以下几个:
JsonCpp
JsonCpp 是一个 C++ 用来处理 JSON 数据的开发包。
网址:http://jsoncpp.sourceforge.net/