• Qt天气预报系统之JSON


    • 1、什么是JSON?

    JSON(JavaScript Object Notation)是一种轻量级的、通用的数据格式,可供各式各样的客户端和服务端进行通信;

    JSON本质上是一种特殊格式的字符串

    它有以下特点:

    • 便于阅读书写

            除了JSON格式,还有一种数据传输格式XML(Qt的ui文件就是XML格式);相对于XML,JSON更加利于阅读

    • 独立于编程语言

            几乎在所有的编程语言和开发环境中,都有解析和生成JSON字符串的库

    1. # C
    2. Jansson,cJSON
    3. # C++
    4. jsonCpp,JSON for Modern C++
    5. # Java
    6. json-lib,org-json
    7. # Android
    8. Gson FastJson
    9. # Qt
    10. QJsonXxx
    • 网络传输的标准格式

            基于以上特点,JSON成为了网络传输使用率最高的数据格式

    2、JSON的两种数据格式

    JSON有两种数据格式

    • JSON对象
    • JSON数组

    规则:被大括号包裹的是JSON对象;被中括号包裹的是JSON数组

    2.1 JSON数组

    JSON数组格式

    [元素1,元素2,元素3,...,元素n]

     此处的元素可以是不同的数据类型,包括:整形、浮点、字符串、布尔、JSON数组、JSON对象、空值

    [ 1,2.5,“hello”,true,null ]

     JSON数组嵌套

    [

            [ 1,2,3 ],

            [ "hello","my","baby" ],

            [ 1,2.5,“hello”,true,null ]

    ]

    JSON数组嵌套对象

    [

            {

                    "name" : "Tom",

                    "age" : 18

            }

            {

                    "name" : "Jim",

                    "age"   : 19

            }

     2.2 JSON对象

    JSON对象格式:

    {

            "key1" : value1,

            "key2" : value2,

            "key3" : value3

    }

     键key是标准的字符串类型,值value可以是:整形、浮点、字符串、布尔、JSON数组、JSON对象、空值

    {
        "name": "China",
        "info": {
            "capital": "beijing ",
            "asian": true,
            "founded": 1949
        },
        "provinces": [{
                "name": "shandong ",
                "capital": "jinan"
            },
            {
                "name": "guangdong ",
                "capital": "guangzhou"
            }
        ]
    }

    2.3 JSON的在线解析

    JSON在线解析工具1

    JSON在线解析工具2

    JSON解析工具演示

    3、Qt中使用JSON 

    3.1JSON相关的类

    • QJsonObject
    • QJsonArray
    • QJsonValue
    • QJsonDocument
     (1)QJsonObject

    QJsonObject封装了JSON中的对象,可以存储多个键值对。

    其中键为字符串类型,值为QJsonValue类型

    • 创建一个QJsonObject对象
    QJsonObject::QJsonObject();
    • 将键值添加到QJsonObject对象中
    QJsonObject::iterator insert(const QString &key,const QJsonValue &value);
    • 获取QJsonObject对象中的键值对个数
    1. int QJsonObject::count() const;
    2. int QJsonObject::size() const;
    3. int QJsonObject::length() const;
    • 通过key获得value的值
    1. QJsonValue QJsonObject::value(const QString &key) const;
    2. QJsonValue QJsonObject::operator[](const QString &key) const;
    • 检查key是否存在
    1. iterator QJsonObject::find(const QString &key);
    2. boll QJsonObject::contains(const QString &key) const;
    • 遍历key 
    QStringList QJsonObject::keys() const;
    (2)QJsonArray
    •  创建一个QJsonArray
    QJsonArray::QJsonArray();
    • 添加数组元素
    1. //添加到头部和尾部
    2. void QJsonArray::append(const QJsonValue &value);
    3. void QJsonArray::prepend(const QJsonValue &value);
    4. //插入到i的位置之前
    5. void QJsonArray::insert(int i,const QJsonValue &value);
    6. //添加到头部和尾部
    7. void QJsonArray::push_front(const QJsonValue &value);
    8. void QJsonArray::push_back(const QJsonValue &value);
    • 获取QJsonArray元素个数
    1. int QJsonArray::count() const;
    2. int QJsonArray::size() const;
    • 获取元素的值
    1. //获取头部和尾部的值
    2. QJsonValue QJsonArray::first() const;
    3. QJsonValue QJsonArray::last() const;
    4. //获取指定位置的值
    5. QJsonValue QJsonArray::at(int i) const;
    6. QJsonValueRef QJsonArray::operator[](int i);
    • 删除元素
    1. //删除头部和尾部
    2. void QJsonArray::pop_front(;
    3. void QJsonArray::pop_back();
    4. void QJsonArray::removeFirst();
    5. void QJsonArray::removeLast();
    6. //删除指定位置
    7. void QJsonArray::removeAt(int i);
    8. QJsonValue QJsonArray::takeAt(int i);
    (3)QJsonValue

    封装了6种数据类型

    # 布尔

    QJsonValue::Bool

    # 浮点类型(包括整形)

    QJsonValue::Double

    # 字符串类型

    QJsonValue::String

    # Json数组类型

    QJsonValue::Array

    # Json对象类型

    QJsonValue::Object

    # 空值类型

    QJsonValue::Null

    通过以下方式来构造QJsonValue对象

    字符串

    QJsonValue(const char *s);

    QJsonValue(QLatinlString s);

    QJsonValue(const QString &s);

    整形or浮点型

    QJsonValue(qint64 v);

    QJsonValue(int v);

    QJsonValue(double v);

    布尔

    QJsonValue(bool b);

    Json对象

    QJsonValue(const QJsonObject &o);

    Json数组

    QJsonValue(const QJsonArray &a);

    空值类型

    QJsonValue(QJsonValue::Type type = Null);

    如果已经得到了QJsonValue如何判断内部封装的是什么类型的数据?

    bool isString() const;

    bool isDouble() const;

    bool isBool() const;

    bool isObject() const;

    bool isArray() const;

    bool isUndefined() const;

    bool isNull() const;

    通过以上判断函数以后,如果有需求可以将其转换为对应的基础数据类型,对应的API函数如下:

    转换为字符串

    Qstring toString() const;

    Qstring toString(const QString &defaultValue) const;

    转换为浮点

    double toDouble(double defaultValue = 0) const;

    转换为整型

    int toInt(int defaultValue = 0) const

    转换为布尔

    bool toBoll(bool defaultValue = false) const;

    转换为Json对象

    QJsonObject toObject(const QJsonObject &defaultValue) const;

    QJsonObject toObject() const;

    转换为Json数组 

    QJsonArray toArray(const QJsonArray &defaultValue) const;

    QJsonArray toArray() const;

    (4)QJsonDocument

    它封装了一个完整的JSON文档

    它可以从UTF-8编码的基于文本表示,以及Qt本身的二进制格式读取和写入文档

    QJsonObjectQJsonArray这两个是无法直接转换为字符串类型的,需要通过QJsonDocument类来完成二者的转换

    • QJsonObjectQJsonArray   =>  字符串

    1、创建QJsonDocument对象

    QJsonDocument::QJsonDocument(const QJsonObject &object);

    QJsonDocument::QJsonDocument(const QJsonArray &array);

    2、将QJsonDocument对象数据序列化

    QByteArray QJsonDocment::toBinaryData() const;       //二进制格式的Json字符串

    QByteArray QJsonDocment::toJson(JsonFormat format = Indented) const; //文本格式

    3、使用得到的字符串进行数据传输或者保存到文件

    • 字符串 =>  QJsonObjectQJsonArray

    1、将Json字符串 => QJsonDocument对象

    [static]QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, Datavalidation validation = Validate):
    [
    static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

    2、将文档对象转换为json数组/对象

    2.1判断文档中存储的数据是JSON数组还是对象

    bool QJsonDocument::isArray() const;

    bool QJsonDocument::isObject() const;

    2.2转换为JSON数组或对象

    QJsonObject QJsonDocument::array() const;

    QJsonArray QJsonDocument::object() const;

    3、调用QJsonArray/QJsonObject类提供的API获取存储在里面的数据

    4、JSON实战 

    4.1 构建JSON字符串

    实现效果

    {
        "name": "China",
        "info": {
            "capital": "beijing ",
            "asian": true,
            "founded": 1949
        },
        "provinces": [{
                "name": "shandong ",
                "capital": "jinan"
            },
            {
                "name": "guangdong ",
                "capital": "guangzhou"
            }
        ]
    }

    1. #include <QCoreApplication>
    2. #include <QJsonObject>
    3. #include <QJsonArray>
    4. #include <QJsonDocument>
    5. #include <QFile>
    6. #include <QDebug>
    7. void writeJson() {
    8. QJsonObject rootObj;
    9. //1.插入name字段
    10. rootObj.insert("name", "China");
    11. //2 插入info字段
    12. QJsonObject infoObj;
    13. infoObj.insert("capital", "beijing");
    14. infoObj.insert("asian", true);
    15. infoObj.insert("founded", 1949);
    16. rootObj.insert("info", infoObj);
    17. //3 插入provinces字段
    18. QJsonArray provinceArr;
    19. QJsonObject SdObj;
    20. QJsonObject GdObj;
    21. SdObj.insert("name", "shandong");
    22. SdObj.insert("capital", "jinan");
    23. GdObj.insert("name", "guangdong");
    24. GdObj.insert("capital", "guangzhou");
    25. provinceArr.append(SdObj);
    26. provinceArr.prepend(GdObj);
    27. rootObj.insert("province", provinceArr);
    28. //4 将rootObj转化为json字符串
    29. QJsonDocument doc(rootObj);
    30. QByteArray json = doc.toJson();
    31. //5 打印输出
    32. qDebug() << QString(json).toUtf8().data();
    33. //6 将json字符串写入到文件
    34. QFile file("d:\\QtTest\\china.json");
    35. file.open(QFile::WriteOnly);
    36. file.write(json);
    37. file.close();
    38. //文件可以使用NotePad++打开
    39. }
    40. int main(int argc, char* argv[])
    41. {
    42. QCoreApplication a(argc, argv);
    43. writeJson();
    44. return a.exec();
    45. }
    小插曲,配置VS大法配置Qt环境

    B站下载安装第一步

    CSDN使用配置第二步

     

    4.2解析JSON字符串

    1. #include <QCoreApplication>
    2. #include <QJsonObject>
    3. #include <QJsonArray>
    4. #include <QJsonDocument>
    5. #include <QFile>
    6. #include <QDebug>
    7. void fromJson() {
    8. //1.读取文件
    9. QFile file("d:\\QtTest\\china.json");
    10. file.open(QFile::ReadOnly);
    11. QByteArray json = file.readAll();
    12. file.close();
    13. QJsonDocument doc = QJsonDocument::fromJson(json);
    14. if (!doc.isObject()) {
    15. qDebug() << "Not an object!";
    16. return;
    17. }
    18. QJsonObject obj = doc.object();
    19. QStringList keys = obj.keys();
    20. for (int i = 0; i < keys.size(); i++) {
    21. //获取key-value
    22. QString key = keys[i];
    23. QJsonValue value = obj.value(key);
    24. if (value.isBool()) {
    25. //打印输出
    26. qDebug() << key << ":" << value.toBool();
    27. }
    28. else if (value.isString()) {
    29. //打印输出
    30. qDebug() << key << ":" << value.toString();
    31. }
    32. else if (value.isDouble()) {
    33. //
    34. qDebug() << key << ":" << value.toInt();
    35. }
    36. else if (value.isObject()) {
    37. qDebug() << key << ":";
    38. QJsonObject infoObj = value.toObject();
    39. QString capital = infoObj["capital"].toString();
    40. bool asian = infoObj["asian"].toBool();
    41. int founded = infoObj["founded"].toInt();
    42. qDebug() << " " << "capital" << ":" << capital;
    43. qDebug() << " " << "asian" << ":" << asian;
    44. qDebug() << " " << "founded" << ":" << founded;
    45. }
    46. else if (value.isArray()) {
    47. QJsonArray provinceArray = value.toArray();
    48. qDebug() << key << ":";
    49. for (int i = 0; i < provinceArray.size(); i++) {
    50. QJsonObject provinceObj = provinceArray[i].toObject();
    51. QString name = provinceObj["name"].toString();
    52. QString capital = provinceObj["capital"].toString();
    53. qDebug() << " " << "name" << ":" << name << ", capital" << ":" << capital;
    54. }
    55. }
    56. }
    57. }
    58. int main(int argc, char* argv[])
    59. {
    60. QCoreApplication a(argc, argv);
    61. fromJson();
    62. return a.exec();
    63. }

    5、笔记来源于B站明王

  • 相关阅读:
    AI技术:分享8个非常实用的AI绘画网站
    MybatisPlus中Enum的使用(MybatisEnumTypeHandler)及遇到的问题
    【Vue】第一个Vue程序
    策略模式实现方式之Map<K,Function>
    【JVM技术专题】「源码专题」深入剖析JVM的Mutex锁的运行原理及源码实现(底层原理-防面试)
    前端性能优化方法与实战10 优化手段:白屏 300m 和界面流畅优化技巧
    C专家编程 第7章 对内存的思考 7.8 轻松一下---“Thing King”和“页面游戏”
    SpringBoot拦截器Interceptor的使用-基础篇
    机器学习----k-means聚类
    Day42-43
  • 原文地址:https://blog.csdn.net/m0_65417024/article/details/139693990