Qt之JSON数据
Posted CodingBL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。目前我只能封装到这,也许用插件或宏定义的方式可以实现快速定义实体类,但能力有限,有大神可以指导一下。。
以上是关于Qt之JSON数据的主要内容,如果未能解决你的问题,请参考以下文章
26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段