Qt中的JSON操作
JSON(JavaScript Object Notation,js对象标记)是⼀种轻量级的数据交换格式。它基于ECMAScript的⼀个⼦集,使⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。简洁和清晰的的层次结构使得JSON成为理想的数据交换语⾔。易于⼈阅读和编写,同时也易于机器解析和⽣成,并有效的提升⽹络传输效率。关于JSON的更多解释,请参看。
在Qt库中,为JSON的相关操作提供了完整的类⽀持,包括QJsonValue,QJsonObject,QJsonArray,QJsonDocument和QJsonParseError。其中,QJsonValue类表⽰json格式中的⼀个值;QJsonObject表⽰⼀个json对象;QJsonArray顾名思义表⽰⼀个json数组;QJsonDocument主要⽤来读写json⽂档;⽽QJsonParseError是⽤来表⽰json解析过程中出现的错误的⽅便类。下⾯,我们就来看看这些类的详细信息。
QJsonValue
QJsonValue类封装了⼀个json格式中的值。该值可以是如下6中基本类型:
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
⼀个QJsonValue可以表⽰上⾯任何⼀种数据类型。此外,QJsonValue还有⼀个特殊的标志⽤来表⽰未定义的值。可以使⽤
isUndefined()函数来进⾏判断。⽽⼀个QJsonValue中存储的类型可以通过type()或isBool(),isString()之类的函数进⾏查询。同
样,QJsonValue中存储的值可以通过toBool(),toString()等函数转换到具体的类型。
QJsonValue中存储的值在内部是强类型的,并且和QVariant相反,它不会尝试进⾏任何的隐式类型转换。这意味着将QJsonValue转换成⼀个不是它存储的类型,将返回⼀个该类型的模型构造函数返回的值。
其实,说到QJsonValue,还有另⼀个类要说,QJsonValueRef,该类是⼀个对于QJsonArray和QJsonObject来说的⼀个帮助类。当你获得⼀个QJsonValueRef类的对象后,你可以把它当做⼀个QJsonValue对象的应⽤来使⽤。如果你向他赋值,该值会实际作⽤到底层的QJsonArray或者QJsonObject对象中的元素上。⽽要想使⽤该类,可以使⽤⼀下的两个⽅法:
QJsonArray::operator[](int i)
QJsonObject::operator[](const QString& key)const;
下⾯来看⼀下QJsonValue的构造函数:
QJsonValue(Type type = Null)
QJsonValue(bool b)
QJsonValue(double n)
QJsonValue(int n)
QJsonValue(qint64 n)
QJsonValue(const QString &s)
QJsonValue(QLatin1String s)
QJsonValue(const char *s)
QJsonValue(const QJsonArray &a)
QJsonValue(const QJsonObject &o)
QJsonValue(const QJsonValue &other)
可以看到,该类主要是对基本类型的⼀个包装。
QJsonObject
QJsonObject类封装了⼀个json对象。⼀个json对象是⼀个键值对的列表,其中key是唯⼀的字符串,⽽值就是⼀个我们上⾯讲到的QJsonValue。⼀个QJsonObject的对象可以转换到QVariantMap,要可以由QVariantMap转换得到。
我们可以使⽤size()函数来查询⼀个QJsonObject中存储的键值对的个数;使⽤insert()和remove()来插
⼊或从中删除键值对;还可以使⽤标准的C++迭代器来遍历它。
QJsonObject类是⼀个隐式共享类。
其构造函数如下:
QJsonObject()
QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
QJsonObject(const QJsonObject &other)
我们可以使⽤初始化列表来快速的构建⼀个QJsonObject对象。如下:
QJsonObject object
{
{"property1", 1},
{"property2", 2}
};
如此之外,⽐较常⽤的就是insert()函数了:
iterator QJsonObject::insert(const QString &key, const QJsonValue &value)
⼀般,我们可以先定义⼀个空的QJsonObject对象,然后使⽤该函数向其中插⼊需要的键值对。如果新插⼊的key已存在,那么会进⾏替换。
下⾯,我们通过⼀个例⼦还使⽤该类构造如下json字符串:{"name":"lily", "age":23, "addr":{"city":"xxx", "province":"yyy"}}
代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJsonObject obj;
obj.insert("name", "lily");
obj.insert("age", 23);
QJsonObject addr;
addr.insert("city", "guangzhou");
addr.insert("province", "guangdong");
obj.insert("addr", addr);
qDebug() << obj;
();
}
我们先构建了⼀个QJsonObject对象obj,然后向其中插⼊姓名和年龄键值对;因为地址⼜是⼀个QJsonObject,所以我们⼜构建了addr 对象,向其中插⼊城市和省份,最后,将该QJsonObject做为地址键值对的值,插⼊到obj中。打印结果如下:
QJsonArray
顾名思义,QJsonArray封装了⼀个JSON数组。⼀个JSON数组是⼀个值的列表。我们可以向这个列表中插⼊或删除QJsonValue。同时,我们可以把⼀个QVariantList转换成⼀个QJsonArray。也可以使⽤标准C++迭代器对它进⾏遍历。
其构造函数如下:
QJsonArray()
QJsonArray(std::initializer_list<QJsonValue> args)
QJsonArray(const QJsonArray &other)
我们也可以像上⾯那样,使⽤⼀个初始化列表来构建⼀个QJsonArray对象:
QJsonArray array = { 1, 2.2, QString() };
在此我们只使⽤了单个的值,没有使⽤键值对。其实,这样的json对象,⼀般我们就称为数组。
和QJsonObject⼀样,我们⼀般也是通过它的insert()函数来⽣成我们需要的json数组:
void insert(int i, const QJsonValue &value)
iterator insert(iterator before, const QJsonValue &value)
下⾯,我们继续上⾯的例⼦,来⽣成⼀个表⽰⼈物信息的列表。代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonArray>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJsonObject obj1;
obj1.insert("name", "lily");
obj1.insert("age", 23);
QJsonObject addr1;
addr1.insert("city", "guangzhou");
addr1.insert("province", "guangdong");
obj1.insert("addr", addr1);
qDebug() << obj1;
QJsonObject obj2;
obj2.insert("name", "tom");
obj2.insert("age", 24);
QJsonObject addr2;
addr2.insert("city", "shenzhen");
addr2.insert("province", "guangdong");
obj2.insert("addr", addr2);
qDebug() << obj2;
QJsonObject obj3;
obj3.insert("name", "jerry");
obj3.insert("age", 24);
QJsonObject addr3;
addr3.insert("city", "foshan");
addr3.insert("province", "guangdong");
obj3.insert("addr", addr3);
qDebug() << obj3;
QJsonArray array;
array.push_back(obj1);
array.push_back(obj2);
array.push_back(obj3);
qDebug() << array;
();
}
在此,我们只是简单的构建了三个⼈物的QJsonObject对象,然后将它们放⼊⼀个QJsonArray中。输⼊结果如下:
QJsonDocument
QJsonDocument类提供了读写JSON⽂档的⽅法。QJsonDocument类包装了⼀个完整的JSON ⽂档,我们可以以utf-8编码的⽂本格式和Qt⾃⼰的⼆进制格式来操作该⽂档。⼀个JSON⽂档可以使⽤QJson
Document::fromJson()函数转换json⽂本字符串来得到。⽽toJson()可以将其转换成⽂本。这个解析器是⾮常快速和⾼效的,Qt也是使⽤它来将JSON对象转换成其⼆进制表⽰的。解析得到的⽂档可以使⽤isNull()来判断是否有效。还可以使⽤isArray()和isObject()函数来判断该⽂档所包含的是否是数据或json对象。如果是,可以使⽤array()或object()函数还获得其中的对象或数组。
其构造函数如下:
QJsonDocument()
QJsonDocument(const QJsonObject &object)js获取json的key和value
QJsonDocument(const QJsonArray &array)
QJsonDocument(const QJsonDocument &other)
除了构造函数外,该类还提供了两个转换函数,可以将json⽂档序列化为⼆进制对象,然后我们就可以将该对象存储到⽂件中,或发送到⽹络上。
QByteArray toBinaryData() const
QByteArray toJson(JsonFormat format = Indented) const
下⾯,我们就使⽤该类将我们上⾯⽣成的json数组写⼊到⽂件中:
代码如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。