jsonDocument.toJson();
C、QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)
D、QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
三、QJsonArray
1、QJsonArray简介
QJsonArray封装了JSON数组。
JSON数组是值的链表,可以插入和删除QJsonValue。
QJsonArray与QVariantList可以相互转换。QJsonArray可以用size(), insert(), removeAt()进行操作,还可以用标准C++的迭代器模式来迭代其内容。
QJsonArray是一个隐式共享的类,只要没有被改变,可以和创建QJsonArray的document共享数据。
通过QJsonDocument可以将一个QJsonArray转换成或转换自一个文本形式的JSON。
2、QJsonArray成员函数
QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
构建一个QJsonArray
QJsonArray::QJsonArray(const QJsonArray &other)
void QJsonArray::append(const QJsonValue &value)
在QJsonArray尾部插入value
QJsonValue QJsonArray::at(int i) const
返回QJsonArray中索引为i的QJsonValue值
iterator QJsonArray::begin()
const_iterator QJsonArray::begin() const
返回指向数组第一个元素的STL风格迭代器
const_iterator QJsonArray::constBegin() const
返回指向数组第一个元素的const STL风格迭代器
const_iterator QJsonArray::constEnd() const
返回指向数组最后一个元素后的位置的const STL风格迭代器
bool QJsonArray::contains(const QJsonValue &value) const
如果数组中包含value,返回true
int QJsonArray::count() const
返回数组的大小
bool QJsonArray::empty() const
如果数组为空,返回true
const_iterator QJsonArray::end() const
返回指向数组最后一个元素后的位置的STL风格迭代器
iterator QJsonArray::erase(iterator it)
删除迭代器it指向的元素,返回指向下一个元素的迭代器
QJsonValue QJsonArray::first() const
返回数组中的第一个值
[static] QJsonArray QJsonArray::fromStringList(const QStringList &list)
将一个字符串链表list转换为QJsonArray
[static] QJsonArray QJsonArray::fromVariantList(const QVariantList &list)
将链表list转换为QJsonArray
四、QJsonObject
1、QJsonObject简介
QJsonObject类用于封装JSON对象。JSON对象是包含键值对的链表,其中键是唯一的字符串,其值由QJsonValue代表。
QJsonObject可以与QVariantMap相互转换,可以用size()来获得键值对的数目,insert()、remove()分别用来插入和删除pair。可以用标准C++的迭代器模式(iterator pattern)来迭代其内容。
QJsonObject是一个隐式共享的类,只要没有被改变过,QJsonObject会和创建它的document共享数据。
可以通过QJsonDocument将QJsonObject和文本格式相互转换。
2、QJsonObject成员函数
QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
使用键值对链表构建QJsonObject对象
QJsonObject::QJsonObject(const QJsonObject &other)
iterator QJsonObject::begin()
const_iterator QJsonObject::begin() const
返回指向JSON对象的第一个元素的STL风格的迭代器
const_iterator QJsonObject::constBegin() const
返回指向JSON对象的第一个元素的const STL风格的迭代器
const_iterator QJsonObject::constEnd() const
返回SJON对象的最后一个元素后的位置的const STL风格的迭代器
const_iterator QJsonObject::constFind(const QString &key) const
返回一个指向键值对中键为key的元素的const迭代器
bool QJsonObject::contains(const QString &key) const
如果JSON对象中包含键key,返回true
int QJsonObject::size() const
int QJsonObject::count() const
返回JSON对象中键值对的数量
bool QJsonObject::empty() const
bool QJsonObject::isEmpty() const
如果JSON对象为空,返回true
iterator QJsonObject::find(const QString &key)
const_iterator QJsonObject::find(const QString &key) const
返回指向JSON对象中键为key的键值对的迭代器
[static] QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash)
将hash转换为JSON对象
[static] QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)
将map转换为JSON对象
iterator QJsonObject::insert(const QString &key, const QJsonValue &value)
插入键为key,值为value的键值对,返回插入键值对的迭代器
QStringList QJsonObject::keys() const
返回JSON对象的所有键的链表
void QJsonObject::remove(const QString &key)
删除JSON对象中的key
QJsonValue QJsonObject::take(const QString &key)
删除JSON对象中的键key,返回key对应的QJsonValue
QVariantHash QJsonObject::toVariantHash() const
将JSON对象转换为QVariantHash
QVariantMap QJsonObject::toVariantMap() const
将JSON对象转换为QVariantMap
QJsonValue QJsonObject::value(const QString &key) const
返回key对应的QJsonValue值
五、QJsonParseError
1、QJsonParseError简介
QJsonParseError类用于在JSON解析中报告错误。
QJsonValue类封装了JSON中的值。JSON中的值有6种基本类型:
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
Undefined QJsonValue::Undefined
value可以是以上任何一种数据类型。另外,QJsonValue有一个特殊的flag来表示未定义类型。可以用isUndefined()来查询。
可以用type()或isBool(),、isString()等来查询value的类型。类似的,可以用toBool()、toString()等将一个value转换成存储在该value内部的类型。
2、QJsonValue成员函数
[static] QJsonValue QJsonValue::fromVariant(const QVariant &variant)
将variant转换为QJsonValue
bool QJsonValue::isArray() const
如果QJsonValue包含一个数组,返回true
bool QJsonValue::isBool() const
如果QJsonValue包含一个bool,返回true
bool QJsonValue::isDouble() const
如果QJsonValue包含一个double,返回true
bool QJsonValue::isNull() const
如果QJsonValue包含一个Null,返回true
bool QJsonValue::isObject() const
如果QJsonValue包含一个object,返回true
bool QJsonValue::isString() const
如果QJsonValue包含一个string,返回true
bool QJsonValue::isUndefined() const
如果QJsonValue包含一个undefined,返回true
QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const
将QJsonValue转换为QJsonArray并返回,如果类型不是array,返回默认值defaultValue
QJsonArray QJsonValue::toArray() const
将QJsonValue转换为QJsonArray并返回
bool QJsonValue::toBool(bool defaultValue = false) const
将QJsonValue转换为bool并返回
double QJsonValue::toDouble(double defaultValue = 0) const
将QJsonValue转换为double并返回
int QJsonValue::toInt(int defaultValue = 0) const
将QJsonValue转换为int并返回
QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const
QJsonObject QJsonValue::toObject() const
将QJsonValue转换为QJsonObject并返回
QString QJsonValue::toString(const QString &defaultValue = QString()) const
将QJsonValue转换为QString并返回
Type QJsonValue::type() const
返回QJsonValue的类型
六、JSON解析编程
1、JSON解析流程
JSON解析的流程如下:
A、将对应的字符串生成QJsonDocument对象
B、判断QJsonDocument对象是QJsonObject还是QJsonArray
C、如果是QJsonObject类型,获取一个QJsonObject对象,然后根据QJsonObject的API函数进行解析
D、如果是QJsonArray类型,获取一个QJsonArray对象,然后根据QJsonArray的API函数进行解析
E、根据获取的QJsonObject或QJsonArray取得QJsonValue类型的数据
F、迭代分解数据获取各个值
JSON解析流程实例:
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QStringList>
#include <QDebug>
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QString json("{\"name\":\"scorpio\", \"year\":2016, \"array\":[30, \"hello\", true]}");
QJsonParseError jsonerror;
QJsonDocument doc = QJsonDocument::fromJson(json.toLatin1(), &jsonerror);
if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
if(doc.isObject())
QJsonObject object = doc.object();
QStringList list = object.keys();
for(int i = 0; i < list.count(); i++)
qDebug() << list.at(i);
QJsonObject::iterator it = object.begin();
while(it != object.end())
switch(it.value().type())
case QJsonValue::String:
qDebug() << "Type is string";
QJsonArray sub = it.value().toArray();
qDebug() << it.key() << "=" << it.value().toString();
break;
case QJsonValue::Array:
qDebug() << "Type is Array";
qDebug() << it.key() << "=" << it.value().toArray();
QJsonArray sub = it.value().toArray();
qDebug() << "index 1:" << sub.at(0).toDouble();
qDebug() << "index 2:" << sub.at(1).toString();
qDebug() << "index 3:" << sub.at(2).toBool();
break;
case QJsonValue::Bool:
qDebug() << "Type is Bool";
qDebug() << it.key() << "=" << it.value().toBool();
break;
case QJsonValue::Double:
qDebug() << "Type is Double";
qDebug() << it.key() << "=" << it.value().toDouble();
break;
case QJsonValue::Object:
qDebug() << "Type is Object";
qDebug() << it.key() << "=" << it.value().toObject();
break;
case QJsonValue::Null:
qDebug() << "Type is Null";
qDebug() << it.key() << "= NULL" ;
break;
case QJsonValue::Undefined:
qDebug() << "Type is Undefined";
break;
it++;
return a.exec();
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson();
QString strJson(byteArray);
C、解析JSON
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"))
{ // 包含指定的 key
QJsonValue value = object.value("Name");
if (value.isString())
{ // 判断 value 是否为字符串
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 document;
document.setArray(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
C、解析JSON
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;
"Developers": "https://www.qt.io/developers/",
"Download": "https://www.qt.io/download/",
"Home": "https://www.qt.io/"},
"Version": [
4.8,
5.2,
5.7]
// 构建 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);
//解析JSON
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;
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QString>
#include <QJsonParseError>
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QJsonArray jsonArray;
jsonArray.insert(0,"linux");
jsonArray.insert(1,"python");
jsonArray.insert(2,"java");
QJsonObject json;
json.insert("name",QString("QT"));
json.insert("version",5);
json.insert("windows",true);
json.insert("language",jsonArray);
QJsonDocument document;
document.setObject(json);
QByteArray bytearray = document.toJson(QJsonDocument::Compact);
QString jsonStr(bytearray);
qDebug() << bytearray;
qDebug() << jsonStr;
QJsonParseError jsonError;
QJsonDocument paserDoc = QJsonDocument::fromJson(bytearray,&jsonError);
if (jsonError.error == QJsonParseError::NoError) {
QJsonObject paserObj = paserDoc.object();
if (paserObj.contains("name")) {
QJsonValue nameValue = paserObj.take("name");
if (nameValue.isString()) {
qDebug() << "name: " << nameValue.toString();
if (paserObj.contains("version")) {
QJsonValue version = paserObj["version"];
if (version.isDouble())
qDebug() << "version: " << version.toInt();
if (paserObj.contains("language")) {
QJsonValue langValue = paserObj.take("language");
if (langValue.isArray()) {
QJsonArray array = langValue.toArray();
for(int i = 0; i < array.size(); ++i) {
QJsonValue tmp = array.at(i);
if (tmp.isString())
qDebug() << tmp.toString();
return a.exec();
"{\"language\":[\"linux\",\"python\",\"java\"],\"name\":\"QT\",\"version\":5,\"w
indows\":true}"
"{\"language\":[\"linux\",\"python\",\"java\"],\"name\":\"QT\",\"version\":5,\"w
indows\":true}"
name: "QT"
version: 5
"linux"
"python"
"java"
原文:https://blog.51cto.com/9291927/1884442