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

 
   
   
 
  1. #ifndef ENTITY_H

  2. #define ENTITY_H

  3. #include<QJsonObject>

  4. #include<QJsonDocument>

  5. class Entity

  6. {

  7. public:

  8.    //将实体类化为jsonobject

  9.    virtual QJsonObject toJsonObject() = 0;

  10.    //将JsonObject转化为对象

  11.    virtual void fromJsonObject(const QJsonObject& jsonObject) = 0;

  12.    //将字符串转化为对象

  13.    virtual bool fromJsonString(const QString& string);

  14.    //将对象转化为字符串

  15.    virtual QString toJsonString();

  16. };


  17. #endif // ENTITY_H

Entity.cpp

 
   
   
 
  1. #include "entity.h"

  2. bool Entity::fromJsonString(const QString &string)

  3. {


  4.    QJsonParseError json_error;

  5.    //将字符串转化为jsonObject,此处注意编码

  6.    QJsonDocument parse_doucment = QJsonDocument::fromJson(string.toUtf8(), &json_error);

  7.    if(json_error.error == QJsonParseError::NoError&&parse_doucment.isObject())

  8.    {

  9.        //将Object转化为对象

  10.        fromJsonObject(parse_doucment.object());

  11.        return true;

  12.    }else{

  13.        return false;

  14.    }


  15. }


  16. QString Entity::toJsonString()

  17. {

  18.    QJsonDocument document;

  19.    //先将对象转化为JsonObject,再赋值给document,利用其转化为字符串

  20.    document.setObject(toJsonObject());

  21.    return QString(document.toJson(QJsonDocument::Compact));

  22. }

2、定义子类

举例:老师 1、Teacher.h

 
   
   
 
  1. #ifndef TEACHER_H

  2. #define TEACHER_H

  3. #include<QJsonObject>

  4. #include<QString>

  5. #include"entity.h"

  6. class Teacher:public Entity

  7. {

  8. public:

  9.    Teacher();

  10.    int getAge() const;

  11.    void setAge(int value);


  12.    QString getName() const;

  13.    void setName(const QString &value);


  14.    virtual QJsonObject toJsonObject();

  15.    virtual void fromJsonObject(const QJsonObject& jsonObject);

  16. private:

  17.    QString name;

  18.    int age;

  19. };


  20. #endif // TEACHER_H

2、Teacher.cpp

 
   
   
 
  1. #include "teacher.h"


  2. Teacher::Teacher()

  3. {


  4. }


  5. int Teacher::getAge() const

  6. {

  7.    return age;

  8. }


  9. void Teacher::setAge(int value)

  10. {

  11.    age = value;

  12. }


  13. QString Teacher::getName() const

  14. {

  15.    return name;

  16. }


  17. void Teacher::setName(const QString &value)

  18. {

  19.    name = value;

  20. }


  21. QJsonObject Teacher::toJsonObject()

  22. {

  23.    QJsonObject data;

  24.    data.insert("name",name);

  25.    data.insert("age",age);

  26.    return data;

  27. }


  28. void Teacher::fromJsonObject(const QJsonObject &jsonObject)

  29. {

  30.    name = jsonObject.value("name").toString();

  31.    age = jsonObject.value("dealResult").toInt();

  32. }

3、使用方法

 
   
   
 
  1. Teacher teacher

  2. teacher.fromJsonString(json);

  3. teacher.toJsonString();

4、总结

优点:通过封装之后,在使用时不需要再关心Qt json的相关类,只需要关心对象与字符串之间的转化。

缺点:还是不够自动化,学过Java的我,觉得json使用的最高境界就是GSON。目前我只能封装到这,也许用插件或宏定义的方式可以实现快速定义实体类,但能力有限,有大神可以指导一下。。


以上是关于Qt之JSON数据的主要内容,如果未能解决你的问题,请参考以下文章

QT 实用代码片段

实用代码片段将json数据绑定到html元素 (转)

QT之JSON格式生成

如何在android中将json数据加载到片段中

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

如何从片段中的 JSON 响应中的对象获取数据