QJsonDocument是Qt操作JSON数据的中心类。
它的公有函数如下:
QJsonDocument()
QJsonDocument(const QJsonObject & object)
QJsonDocument(const QJsonArray & array)
QJsonDocument(const QJsonDocument & other)
~QJsonDocument()
void setArray(const QJsonArray & array)
void setObject(const QJsonObject & object)//以上都是往文档中填充数据的
QJsonArray array() const//返回“值”部分的内容(或说将其转化为json数组),一般与下面四个is开头的联合使用
QJsonObject object() const//与上一个相类似,只不过转成json对象
bool isArray() const//以下四个用于判断"值"部分的类型
bool isEmpty() const
bool isNull() const
bool isObject() const
QByteArray toBinaryData() const//以下三个,将数据转化成其它类型用于存诸或其它用处
QByteArray toJson(JsonFormat format = Indented) const
QVariant toVariant() const
const char * rawData(int * size) const
bool operator!=(const QJsonDocument & other) const
QJsonDocument & operator=(const QJsonDocument & other)
bool operator==(const QJsonDocument & other) const
静态成员函数(Static Public Members)都是用来往document上添加json数据的:
QJsonDocument fromBinaryData(const QByteArray & data, DataValidation validation = Validate)//DataValidation为对数据进行判断是否有效,无错,枚举值见1
QJsonDocument fromJson(const QByteArray & json, QJsonParseError * error = 0)//这个静态成员函数有“错误”接口。在无法确定json数据绝对有效时,一般用这个
QJsonDocument fromRawData(const char * data, int size, DataValidation validation = Validate)
QJsonDocument fromVariant(const QVariant & variant)
1,enum QJsonDocument::DataValidation
Constant | Value | Description |
---|---|---|
QJsonDocument::Validate | 0 | 进行判断,default. |
QJsonDocument::BypassValidation | 1 | 不进行validation.只当数据来源可靠且知道它是绝对有效时使用。如果数据无效,则程序崩溃 |
解析的主要步骤如下:
1,将来源数据转化为JsonDocument。可用它的构造函数,或setArray、setObject,或它的静态成员函数。
2,可用下列四函数判断它的最外层数据类型(一般是个对象):
bool isArray() const
bool isEmpty() const
bool isNull() const
bool isObject() const
3,知道类型后,用以下函数将它转化为json对象或json数组或Map
QJsonArray array() const
QJsonObject object() const
QVariant toVariant() const
4,用QJsonArray或QJsonObject 的函数或迭代器遍历取得想要值
——————————————————————————————————————————————————————————————————————————
以下解析例子,所用JSON文档来自上一节介绍JSON时的复杂篇:
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QFile>
#include <QIODevice>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QFile *file=new QFile("://test.json");
file->open(QIODevice::ReadOnly);
QByteArray b= file->readAll();
QJsonParseError *error=new QJsonParseError;
QJsonDocument doc=QJsonDocument::fromJson(b,error);
if(error->error==QJsonParseError::NoError)
{
if(doc.isObject())
{
QJsonObject obj=doc.object();//取得最外层这个大对象
//这里放代码,对json数据进行取值
}
}else
{
qDebug()<<error->errorString();
}
}
Dialog::~Dialog()
{
delete ui;
}
放代码部分可以有几种取值方法
1,数组,层层深入
QJsonArray Array=obj["姓名"].toArray();
QJsonObject obj1=Array[0].toObject();
QJsonObject obj2=obj1["张三"].toObject();
qDebug()<<"张三性别"<<obj2["性别"].toString();
不管是QJsonObject还是QJsonArray,它们都有数组一样的下标方式取值
2,通过迭代器遍历
QJsonArray::iterator//也存在这个……
它们两个都有用于遍历的迭代器类。
以QJsonObject为例,可用格式如下:
for (QJsonObject::Iterator it = obj.begin();it != obj.end(); it++)
{
QJsonValue value=it.value();
QJsonArray Array=value.toArray();//将value转成QJsonArray或QJsonObject,继续遍历
}
3,既然迭代器可以,我猜想foreach函数也是可以滴(未测试成功)
QJsonArray Array=obj["姓名"].toArray();
foreach (QJsonValue v, Array) {
qDebug()<<v.toString();
}
可结合:QVariantMap result
= jsonDocument
.toVariant
(
)
.toMap
(
)
;使用,这样转化为遍历一个Map
怎样灵活组合遍历出想要的值,是语言本身的问题了,不多说……