Qt模块化笔记之core——使用QJsonDocument解析JSON

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,通过迭代器遍历

QJsonObject::iterator

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

怎样灵活组合遍历出想要的值,是语言本身的问题了,不多说……




  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt提供了QJsonDocument、QJsonObject、QJsonArray等类,可以方便地对JSON数据进行解析、生成和操作。 下面是一个简单的例子,演示如何使用QtJSON模块解析一个JSON字符串: ```c++ #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDebug> int main() { QString jsonStr = "{\"name\":\"Alice\", \"age\":20, \"scores\":[85, 90, 95]}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8()); if(jsonDoc.isNull()){ qWarning() << "Parse failed"; return -1; } if(jsonDoc.isObject()){ QJsonObject jsonObj = jsonDoc.object(); if(jsonObj.contains("name") && jsonObj["name"].isString()){ QString name = jsonObj["name"].toString(); qDebug() << "name:" << name; } if(jsonObj.contains("age") && jsonObj["age"].isDouble()){ int age = jsonObj["age"].toInt(); qDebug() << "age:" << age; } if(jsonObj.contains("scores") && jsonObj["scores"].isArray()){ QJsonArray scoresArray = jsonObj["scores"].toArray(); qDebug() << "scores:"; for(int i = 0; i < scoresArray.size(); i++){ if(scoresArray[i].isDouble()){ int score = scoresArray[i].toInt(); qDebug() << score; } } } } return 0; } ``` 在上面的例子中,首先定义了一个JSON格式的字符串jsonStr,然后使用QJsonDocument::fromJson()函数将其解析为一个QJsonDocument对象。 接着,使用QJsonDocument对象的成员函数来判断该JSON数据的类型,并进行相应的解析操作。如果是一个JSON对象,则调用QJsonObject对象的成员函数来获取其中的值。 需要注意的是,在解析JSON数据时,需要先判断该值是否存在并且是否是正确的类型,才能进行相应的操作,否则会导致程序崩溃或数据不正确。 除了解析JSON数据之外,QtJSON模块还可以用于生成JSON数据和操作JSON数据,具体用法可以参考Qt的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值