转载:使用 QJsonDocument 处理 JSON

Qt5 新增加六个相关类:

QJsonArray 封装 JSON 数组
QJsonDocument 读写 JSON 文档
QJsonObject 封装 JSON 对象
QJsonObject::iterator 用于遍历QJsonObject的 STL 风格的非 const 遍历器
QJsonParseError 报告 JSON 处理过程中出现的错误
QJsonValue 封装 JSON 值

我们还是使用前一章的 JSON 文档,这次换用QJsonDocument 来解析。注意,QJsonDocument要求使用 Qt5,本章中所有代码都必须在 Qt5 环境下进行编译运行。

QString json("{"
"\"encoding\" : \"UTF-8\","
"\"plug-ins\" : ["
"\"python\","
"\"c++\","
"\"ruby\""
"],"
"\"indent\" : { \"length\" : 3, \"use_space\" : true }"
"}");
QJsonParseError error;
QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toUtf8(), &error);
if (error.error == QJsonParseError::NoError) {
if (jsonDocument.isObject()) {
QVariantMap result = jsonDocument.toVariant().toMap();
qDebug() << "encoding:" << result["encoding"].toString();
qDebug() << "plugins:";

foreach (QVariant plugin, result["plug-ins"].toList()) {
qDebug() << "\t-" << plugin.toString();
}

QVariantMap nestedMap = result["indent"].toMap();
qDebug() << "length:" << nestedMap["length"].toInt();
qDebug() << "use_space:" << nestedMap["use_space"].toBool();
}
} else {
qFatal(error.errorString().toUtf8().constData());
exit(1);
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

QString json("{"

"\"encoding\" : \"UTF-8\","

"\"plug-ins\" : ["

"\"python\","

"\"c++\","

"\"ruby\""

"],"

"\"indent\" : { \"length\" : 3, \"use_space\" : true }"

"}");

QJsonParseError error;

QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toUtf8(), &error);

if (error.error == QJsonParseError::NoError) {

if (jsonDocument.isObject()) {

QVariantMap result = jsonDocument.toVariant().toMap();

qDebug() << "encoding:" << result["encoding"].toString();

qDebug() << "plugins:";

foreach (QVariant plugin, result["plug-ins"].toList()) {

qDebug() << "\t-" << plugin.toString();

}

QVariantMap nestedMap = result["indent"].toMap();

qDebug() << "length:" << nestedMap["length"].toInt();

qDebug() << "use_space:" << nestedMap["use_space"].toBool();

}

} else {

qFatal(error.errorString().toUtf8().constData());

exit(1);

}

这段代码与前面的几乎相同。QJsonDocument::fromJson()可以由QByteArray对象构造一个QJsonDocument对象,用于我们的读写操作。这里我们传入一个QJsonParseError对象的指针作为第二个参数,用于获取解析的结果。如果QJsonParseError::error()的返回值为QJsonParseError::NoError,说明一切正常,则继续以QVariant的格式进行解析(由于我们知道这是一个 JSON 对象,因此只判断了isObject()。当处理未知的 JSON 时,或许应当将所有的情况都考虑一边,包括isObject()isArray()以及isEmpty())。

也就是说,如果需要使用QJsonDocument处理 JSON 文档,我们只需要使用下面的代码模板:

// 1. 创建 QJsonParseError 对象,用来获取解析结果
QJsonParseError error;
// 2. 使用静态函数获取 QJsonDocument 对象
QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toUtf8(), &error);
// 3. 根据解析结果进行处理
if (error.error == QJsonParseError::NoError) {
if (!(jsonDocument.isNull() || jsonDocument.isEmpty())) {
if (jsonDocument.isObject()) {
// ...
} else if (jsonDocument.isArray()) {
// ...
}
}
} else {
// 检查错误类型
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 1. 创建 QJsonParseError 对象,用来获取解析结果

QJsonParseError error;

// 2. 使用静态函数获取 QJsonDocument 对象

QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toUtf8(), &error);

// 3. 根据解析结果进行处理

if (error.error == QJsonParseError::NoError) {

if (!(jsonDocument.isNull() || jsonDocument.isEmpty())) {

if (jsonDocument.isObject()) {

// ...

} else if (jsonDocument.isArray()) {

// ...

}

}

} else {

// 检查错误类型

}

QVariant对象生成 JSON 文档也很简单:

QVariantList people;

QVariantMap bob;
bob.insert("Name", "Bob");
bob.insert("Phonenumber", 123);

QVariantMap alice;
alice.insert("Name", "Alice");
alice.insert("Phonenumber", 321);

people << bob << alice;

QJsonDocument jsonDocument = QJsonDocument::fromVariant(people);
if (!jsonDocument.isNull()) {
qDebug() << jsonDocument.toJson();
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

QVariantList people;

QVariantMap bob;

bob.insert("Name", "Bob");

bob.insert("Phonenumber", 123);

QVariantMap alice;

alice.insert("Name", "Alice");

alice.insert("Phonenumber", 321);

people << bob << alice;

QJsonDocument jsonDocument = QJsonDocument::fromVariant(people);

if (!jsonDocument.isNull()) {

qDebug() << jsonDocument.toJson();

}

这里我们仍然使用的是QJsonDocument,只不过这次我们需要使用QJsonDocument::fromVariant()函数获取QJsonDocument对象。QJsonDocument也可以以二进制格式读取对象,比如QJsonDocument::fromBinaryData()QJsonDocument::fromRawData()函数。当我们成功获取到QJsonDocument对象之后,可以使用toJson()生成 JSON 文档。

以上介绍了当我们有一个 JSON 文档时,如何使用QJsonDocument进行处理。如果我们没有 JSON 文档,那么我们可以使用QJsonDocumentsetArray()setObject()函数动态设置该对象,然后再生成对应的 JSON 格式文档。不过这部分需求比较罕见,因为我们直接可以从QVariant值类型获取。

Qt5 提供的 JSON 类库直接支持隐式数据共享,因此我们不需要为复制的效率担心。

转自:http://www.devbean.net/2013/09/qt-study-road-2-qjsondocument/

时间: 2024-12-16 08:32:07

转载:使用 QJsonDocument 处理 JSON的相关文章

[转载]Android版本更新与JSON解析

/*  *注意,这篇文章转载自:  *http://blog.csdn.net/xjanker2/article/details/6303937  *一切权利归作者所有,这里只是转载,曾经用到过这篇文章里的方法.复制过来格式混乱,建议去原作者那里获得更好体验.  *我在百度知道的提问  */ 我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新.得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下.首先给出界面效果: 1.

转载C# 对象转Json序列化

转载原地址:  http://www.cnblogs.com/plokmju/p/ObjectByJson.html JSON Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式.这使得Json成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. Json简单来说就是JS中的对象和数组,所以Json也存在两种结构:对象.数组. Json对象:Json对象定义在花括号“{}”内,

Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件

第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求.一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能.它可以用来存放软件信息,注册表信息等. 读INI文件 INI文件内容如下: [conn] ip=127.0.0.1 port=8080 databaseversion=QSQLITE databasename=st

json模块使用总结——Python

# 原创文章,未经允许请勿转载 通过Python的json模块,可以将字符串形式的json数据转化为字典,也可以将Python中的字典数据转化为字符串形式的json数据. 之前使用这个模块时,都是随用随查,浅尝辄止,对模块的功能了解不深. 随着使用次数的增加,我对这个功能完善的模块有了更多的了解,记录如下. 1.json字符串转为字典 json.load / json.loads 两个方法功能类似,可选参数也相同,最大的区别在于,json.load方法接受的输入,即第一个参数,是包含json数据

QT开发(六十二)———QT5解析Json文件

QT开发(六十二)---QT5解析Json文件 一.QT5 Json简介 QT4中使用第三方库QJson解析JSON文件. QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中.QT5新增加六个相关类: QJsonArray 封装 JSON 数组 QJsonDocument 读写 JSON 文档 QJsonObject 封装 JSON 对象 QJsonObject::iterator 用于遍历QJsonObject的STL风格的非const遍历器 QJsonParseE

如何编写package.json配置NodeJS项目的模块声明

在NodeJS项目中,用package.json文件来声明项目中使用的模块,这样在新的环境部署时,只要在package.json文件所在的目录执行 npm install 命令即可安装所需要的模块. package.json文件中可配置的项有:名称(name).应用描述(description).版本号(version).应用的配置项(config).作者(author).资源仓库地址(repository).授权方式(licenses).目录(directories).应用入口文件(main)

JsonSockketTcp套接字 for qt(json数据流传输层)

主要处理tcp的json数据流,解析和除错json数据流,继承与 qtcpsocket层,方便扩展 数据流格式: #ifndef CONFIGTCPSOCKET_H #define CONFIGTCPSOCKET_H #include <QTcpSocket> #include <QJsonDocument> class JsonTcpSocket : public QTcpSocket { Q_OBJECT public: explicit JsonTcpSocket(QObje

Qt中 使用Json 对自定义对象进行序列与反序列化 之一

没有使用多态的情况比较简单,完整代码如下: #include <QCoreApplication> #include <memory> #include <vector> #include <string> #include <iostream> #include <algorithm> #include <QFile> #include <QJsonDocument> #include <QJsonOb

Qt中 使用Json 对自定义对象进行序列与反序列化 之二

在使用多态的情况下,通过基类的指针列表序列化时,需保存对象的类型信息.在反序列化时通过类型信息构造正确的子类对象.代码中类型信息使用C++ typeid获取,以保证可移植性. 全部代码如下: #include <QCoreApplication> #include <memory> #include <vector> #include <string> #include <iostream> #include <algorithm>