您的位置:首页 > 编程语言 > Qt开发

Qt 之 QJsonDocument 解析json 数据

2017-09-29 22:48 447 查看
QJsonDocument是Qt操作JSON数据的中心类。

它的公有函数如下:

[cpp] view
plain copy

    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数据的:

[cpp] view
plain copy

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

ConstantValueDescription
QJsonDocument::Validate0进行判断,default.
QJsonDocument::BypassValidation1不进行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时的复杂篇:

[cpp] view
plain copy

#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,数组,层层深入

[cpp] view
plain copy

QJsonArray Array=obj["姓名"].toArray();  

QJsonObject obj1=Array[0].toObject();  

QJsonObject obj2=obj1["张三"].toObject();  

qDebug()<<"张三性别"<<obj2["性别"].toString();  

不管是QJsonObject还是QJsonArray,它们都有数组一样的下标方式取值

2,通过迭代器遍历

QJsonObject::iterator

QJsonArray::iterator//也存在这个……

它们两个都有用于遍历的迭代器类。

以QJsonObject为例,可用格式如下:

[cpp] view
plain copy

for (QJsonObject::Iterator it = obj.begin();it != obj.end(); it++)  

{  

   QJsonValue value=it.value();  

   QJsonArray Array=value.toArray();//将value转成QJsonArray或QJsonObject,继续遍历  

}  

3,既然迭代器可以,我猜想foreach函数也是可以滴(未测试成功)

[cpp] view
plain copy

QJsonArray Array=obj["姓名"].toArray();  

foreach (QJsonValue v, Array) {  

   qDebug()<<v.toString();  

}  

可结合:QVariantMap result = jsonDocument.toVariant().toMap();使用,这样转化为遍历一个Map

出处: http://blog.csdn.net/iloveqt5/article/details/18993015
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  QJson json QJsonDocu