QT 之JSON數據

Json簡介

JSON:JavaScript 對象表示法(JavaScript Object Notation)。
JSON 是存儲和交換文本信息的語法。類似 XML。
JSON 比 XML 更小、更快,更易解析。

Json語法規則

數據在名稱/值對中
數據由逗號分隔
花括號保存對象
方括號保存數組

Json值

JSON 值可以是:
數字(整數或浮點數)
字符串(在雙引號中)
邏輯值(true 或 false)
數組(在方括號中)
對象(在花括號中)
null…

Qt解析

在Qt5.0以後,爲JSON的操作提供了更加方便的類,包括QJsonDocument、QJsonParseError、QJsonObject,QJsonArray,QJsonValue。其中,QJsonDocument用來讀寫json文檔;QJsonParseError是用來表示json解析過程中出現的錯誤的類;QJsonValue類表示一個值;QJsonObject表示一個json對象;QJsonArray表示一個json數組。

相關API可自行查看文檔,一般處理數據時,考慮的是如何將JSON轉化爲實體類,實體類如何轉化爲JSON。

1、定義一個父類

Entity.h

#ifndef ENTITY_H
#define ENTITY_H
#include<QJsonObject>
#include<QJsonDocument>
class Entity
{
public:
    //將實體類化爲jsonobject
    virtual QJsonObject toJsonObject() = 0;
    //將JsonObject轉化爲對象
    virtual void fromJsonObject(const QJsonObject& jsonObject) = 0;
    //將字符串轉化爲對象
    virtual bool fromJsonString(const QString& string);
    //將對象轉化爲字符串
    virtual QString toJsonString();
};

#endif // ENTITY_H

Entity.cpp

#include "entity.h"
bool Entity::fromJsonString(const QString &string)
{

    QJsonParseError json_error;
    //將字符串轉化爲jsonObject,此處注意編碼
    QJsonDocument parse_doucment = QJsonDocument::fromJson(string.toUtf8(), &json_error);
    if(json_error.error == QJsonParseError::NoError&&parse_doucment.isObject())
    {
        //將Object轉化爲對象
        fromJsonObject(parse_doucment.object());
        return true;
    }else{
        return false;
    }

}

QString Entity::toJsonString()
{
    QJsonDocument document;
    //先將對象轉化爲JsonObject,再賦值給document,利用其轉化爲字符串
    document.setObject(toJsonObject());
    return QString(document.toJson(QJsonDocument::Compact));
}



2、定義子類

舉例:老師
1、Teacher.h

#ifndef TEACHER_H
#define TEACHER_H
#include<QJsonObject>
#include<QString>
#include"entity.h"
class Teacher:public Entity
{
public:
    Teacher();
    int getAge() const;
    void setAge(int value);

    QString getName() const;
    void setName(const QString &value);

    virtual QJsonObject toJsonObject();
    virtual void fromJsonObject(const QJsonObject& jsonObject);
private:
    QString name;
    int age;
};

#endif // TEACHER_H

2、Teacher.cpp

#include "teacher.h"

Teacher::Teacher()
{

}

int Teacher::getAge() const
{
    return age;
}

void Teacher::setAge(int value)
{
    age = value;
}

QString Teacher::getName() const
{
    return name;
}

void Teacher::setName(const QString &value)
{
    name = value;
}

QJsonObject Teacher::toJsonObject()
{
    QJsonObject data;
    data.insert("name",name);
    data.insert("age",age);
    return data;
}

void Teacher::fromJsonObject(const QJsonObject &jsonObject)
{
    name = jsonObject.value("name").toString();
    age = jsonObject.value("dealResult").toInt();
}

3、使用方法

Teacher teacher;
teacher.fromJsonString(json);
teacher.toJsonString();

4、總結

優點:通過封裝之後,在使用時不需要再關心Qt json的相關類,只需要關心對象與字符串之間的轉化。

缺點:還是不夠自動化,學過Java的我,覺得json使用的最高境界就是GSON。目前我只能封裝到這,也許用插件或宏定義的方式可以實現快速定義實體類,但能力有限,有大神可以指導一下。。

若有疑問可以在下方留言,歡迎關注我的公衆號CodingBL。

CodingBL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章