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。