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

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