Qt 学习之路 :使用 QJson 处理 JSON
XML 曾经是各种应用的配置和传输的首选方式。但是现在 XML 遇到了一个强劲的对手:JSON。我们可以在 这里 看到有关 JSON 的语法。总体来说,JSON 的数据比 XML 更紧凑,在传输效率上也要优于 XML。不过 JSON 数据的层次化表达不及 XML,至少不如 XML 那样突出。不过这并不会阻止 JSON 的广泛应用。
一个典型的 JSON 文档可以像下面的例子:
{
"encoding" : "UTF-8",
"plug-ins" : [
"python",
"c++",
"ruby"
],
"indent" : { "length" : 3, "use_space" : true }
}
JSON 的全称是 JavaScript Object Notation,与 JavaScript 密不可分。熟悉 JavaScript 的童鞋马上就会发现,JSON 的语法就是 JavaScript 对象声明的语法。JSON 文档其实就是一个 JavaScript 对象,因而也称为 JSON 对象,以大括号作为起止符,其实质是不排序的键值对,其中键要求是 string 类型,值可以是任意类型。比如上面的示例,键 encoding 的值是字符串 UTF-8;键 plug-ins 的值是一个数组类型,在 JSON 中,数组以中括号表示,这个数组是一个字符串列表,分别有 python、c++ 和 ruby 三个对象;键 indent 的值是一个对象,这个对象有两个属性,length = 3,use_space = true。
对于 JSON 的解析,我们可以使用 QJson 这个第三方库。QJson 可以将 JSON 数据转换为 QVariant 对象,将 JSON 数组转换成 QVariantList 对象,将 JSON 对象转换成 QVariantMap 对象。我们在 这里 使用 git clone 出 QJson 的整个代码。注意 QJson 没有提供链接库的 pro 文件,因此我们只需要将所有源代码文件添加到我们的项目即可(如同这些文件是我们自己写的一样)。接下来就可以使用 QJson 读取 JSON 内容:
Language: C++ (Qt) | |
0 |
#include "parser.h" |
将 JSON 对象转换成 QVariant 对象很简单,基本只需要下面几行:
Language: C++ (Qt) | |
0 |
// 1. 创建 QJson::Parser 对象 |
QJson::Parser::parse() 函数接受两个参数,第一个参数是 JSON 对象,可以是 QIODevice* 或者是 QByteArray;第二个参数是转换成功与否,如果成功则被设置为 true。函数返回转换后的 QVariant 对象。注意我们转换后的对象其实是一个 QVariantMap 类型,可以像 QMap 一样使用重载的 [] 获取键所对应的值。另外,由于 result["plug-ins"] 是一个 QVariantList 对象(因为是由 JSON 数组返回的),因而可以调用其 toList() 函数,通过遍历输出每一个值。
如果需要将 QVariant 生成 JSON 对象,我们则使用 QJson::Serializer 对象。例如:
Language: C++ (Qt) | |
0 |
QVariantList people; |
QJson::Serializer 和前面的 QJson::Parser 的用法相似,只需要调用 QJson::Serializer::serialize() 即可将 QVariant 类型的数据转换为 JSON 格式。其返回值是 QByteArray 类型,可以用于很多其它场合。
上面是 QJson 的主要使用方法。其实 QJson 还提供了另外一个类 QObjectHelper,用于 QVariant 和 QObject 之间的转换。注意我们上面所说的 QJson 的转换需要的是 QVariant 类型的数据,无论是转换到 JSON 还是从 JSON 转换而来。但是通常我们在应用程序中使用的是 QObject 及其子类。QObjectHelper 提供了一个工具函数,完成 QVariant 和 QObject 之间的转换。例如我们有下面的类:
Language: C++ (Qt) | |
0 |
class Person : public QObject |
那么,我们可以使用下面的代码将 Person 类进行 JSON 序列化:
Language: C++ (Qt) | |
0 |
Person person; |
以及:
Language: C++ (Qt) | |
0 |
QJson::Parser parser; |
进行反序列化。
Qt 学习之路 :使用 QJson 处理 JSON的更多相关文章
- Qt 学习之路 2(63):使用 QJson 处理 JSON
Home / Qt 学习之路 2 / Qt 学习之路 2(63):使用 QJson 处理 JSON Qt 学习之路 2(63):使用 QJson 处理 JSON 豆子 2013年9月9日 Qt ...
- Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON 豆子 ...
- 《Qt 学习之路 2》目录
<Qt 学习之路 2>目录 <Qt 学习之路 2>目录 豆子 2012年8月23日 Qt 学习之路 2 177条评论 <Qt 学习之路 2>目录 序 Qt ...
- Qt 学习之路 2(76):QML 和 QtQuick 2
Home / Qt 学习之路 2 / Qt 学习之路 2(76):QML 和 QtQuick 2 Qt 学习之路 2(76):QML 和 QtQuick 2 豆子 2013年12月18日 Qt ...
- Qt 学习之路 2(67):访问网络(3)
Qt 学习之路 2(67):访问网络(3) 豆子 2013年11月5日 Qt 学习之路 2 16条评论 上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作.本章我们将继续完 ...
- Qt 学习之路 2(68):访问网络(4)
Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...
- Qt 学习之路 2(66):访问网络(2)
Home / Qt 学习之路 2 / Qt 学习之路 2(66):访问网络(2) Qt 学习之路 2(66):访问网络(2) 豆子 2013年10月31日 Qt 学习之路 2 27条评论 上一 ...
- Qt 学习之路 2(59):使用流处理 XML
Qt 学习之路 2(59):使用流处理 XML 豆子 2013年7月25日 Qt 学习之路 2 18条评论 本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible ...
- Qt 学习之路 2(6):Qt 模块简介
Home / Qt 学习之路 2 / Qt 学习之路 2(6):Qt 模块简介 豆子 2012年8月26日 Qt 学习之路 2 20条评论 Qt 5 与 Qt 4 最大的一个区别之一是底层架构 ...
- QT学习之路--创建一个对话框
Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...
随机推荐
- 【python】【转】python中isinstance判断变量类型用法
来源 http://www.jb51.net/article/15696.htm 在Python中只需要使用内置的函数isinstance,使用起来非常简单,比如下面的例子: 复制代码 代码如下: c ...
- Python 学习笔记(3) - 控制流、函数
控制流语句if.while.for.break.continue以上从最终作用效果来讲,同学过的其他语言没有什么不同.需要注意的只是语法,而Python 在语法上是如此让人赞叹和喜欢啊. 控制流语句的 ...
- AlertDialog中EditText不能获取焦点以及不宽度不能自动铺满的完美解决方案
问题分析: 因为 dialog的Attributes使用的默认的,其中一个属性就是:flags ,就是这个属性导致不能获取焦点,默认的是FLAG_NOT_FOCUSABLE,故名思义不能获取输入焦点, ...
- objective-C: nonatomic retain copy assgin 等属性详解
http://my.oschina.net/u/728866/blog/90798 property,可以提供的功能有:提供成员变量的访问方法的声明.控制成员变量的访问权限.控制多线程时成员变量的访问 ...
- [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】
题目链接:BZOJ - 1098 题目分析 只有两个点之间有边的时候它们才能在不同的楼内,那么就是说如果两个点之间没有边它们就一定在同一座楼内. 那么要求的就是求原图的补图的连通块. 然而原图的补图的 ...
- 实验一个最小的PYTHON服务器编程
没事,玩玩儿~~~:) 按书上的例子来作.. #!/usr/bin/env python #Simple Server - Chapter 1 -server.py import socket hos ...
- 试试Navicat和Axere RP Pro吧
感觉在作头作起和沟通方面,这些东东真是提高不好效率呢~~~ 由于敏感,只作载图.
- log4j_slf4j log4j.properties
hibernate 使用的日志是slf4j,而 slf4j又有各种实现策略. 使用log4j 就是其中一种方式. 需要的jar 包: log4j-1.2.16.jar slf4j-api-1.6.1. ...
- lc面试准备:Repeated DNA Sequences
1 题目 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &quo ...
- duck type鸭子类型
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于 ...