• Qt解析JSON


    Qt解析JSON


    文中图片来自菜鸟教程runnob

    QT 解析json的三件套,QJsonDocument、QJsonObject、QJsonArray、QJsonValue

    要搞清楚这几个东西,首先得搞清楚JSON得结构。
    JSON主要是有几种格式:

    JSON主要格式

    1. Object(对象)
      在这里插入图片描述

      图片中即为JSON中对象的格式,他由一对花括号({})作为包围,对象可以包含很多键值对(Key-Value),每个键(Key)用引号(“”)括起来,键和值之间用冒号分隔(:),值(Value)可以是bool、数字、字符串、对象、数组或者null。键值对之间用逗号(,)分开。

      {
        "type":1,
        "msg":"Hello World!",
        "nullable":true,
        "member":["ZhangSan", "Lisi", "WangWu"],
        "info":{
                "name":"Zhangsan",
                "id":"1"
               }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      这里就是一个键值对组成得对象。

    2. Array(数组)
      在这里插入图片描述


      如图所示,数组是由一系列值(Value)得有序集合,值与值之间用逗号分开(,)

      [
        "a", 1, true, null,
        {
           "name":"1",
           "key":"123"
        },
        [1,2,3]
      ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      如上所示,这里就是一个JSON数组。

    QT的JSON处理类

    从上面JSON的分析,就可以大概知道怎么在QT去解析一个JSON字符串了。

    1. QJsonObject

      这里就是JSON的对象,由键值对组成,也就是QString和QJsonValue组成

    2. QJsonArray

      这里是JSON的数组,由一系列的JSON的值(QJsonValue)组成

    3. QJsonValue

      JSON的值。可以是bool、数字、字符串、数组、对象

    4. QJsonDocument

      JSON文档。

    例子解析

    想要解析JSON你首先得把一系列的JSON字符串转换成实例化的QJsonDocument对象,然后才能调用QJsonObject或者QJsonArray进行解析。
    例子解析分析:

    // 以下皆用初始化好了的QJsonDocument
    QJsonDocument m_document;
    QFile jsonFile("testJson.json");
    file.open(QIODevice::ReadOnly);
    QByteArray jsonBa = file.readAll();
    
    QJsonParseError error;
    m_document = QJsonDocument::fromJson(jsonBa, &error);
    jsonFile.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 解析基本的数组

      ["ZhangSan","Lisi","WangWu"]
      
      • 1

      解析步骤为:

      • 获取对应的QJsonArray数组
      • 用下标访问的方法,意义获取数组里的值QJsonValue
      • 输出值的内容


      代码实现如下:

      // 开始解析
      QJsonArray array;
      if (m_document.isArray()) {
          array = m_document.array();
      }
      
      for (int i = 0; i < array.size(); i++) {
          QJsonValue value = array.at(i);
          qDebug() << value.toString();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    2. 解析基本的对象

      {
        "name":"Zhangsan",
        "id":"1"
      }
      
      • 1
      • 2
      • 3
      • 4

      解析步骤为:

      • 获取对应的QJsonObject对象
      • 获取对象里的所有键(QString)
      • 逐一输出键对应的值(QJsonValue)


      代码实现如下:

      // 开始解析
      QJsonObject object;
      if (m_document.isObject()) {
          object = m_document.object();
      }
      
      foreach (QString key, object.keys()) {
          qDebug() << object.value(key).toString();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    3. 解析JSON数组组合JSON对象

      [
        {
          "name":"Zhangsan",
          "id":"1"
        }, {"name":"Lisi",
          "id":"2"
        }, {
          "name":"Wangwu",
          "id":"2"
        }
      ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      解析步骤为:

      • 获取对应的QJsonArray数组
      • 用下标访问的方式来获取值(QJsonValue)
      • 如果其中一个值是对象(QJsonObject),就获取这个对象,然后按照对象的解析方法来解析。

      代码实现如下:

      QJsonArray array;
      if (m_document.isArray()) {
          array = m_document.array();
      }
      
      for (int i = 0; i < array.size(); i++) {
          if (array.at(i).isObject()) {
              QJsonObject object = array.at(i).toObject();
      
              if (object.contains("name")) {
                  qDebug() << object.value("name").toString();
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    4. 解析JSON对象组合JSON数组

      {
        "type":"1",
        "member":["Zhangsan", "Lisi", "Wangwu"]
      }
      
      • 1
      • 2
      • 3
      • 4

      解析步骤为:

      • 获取对应的JSON对象(QJsonObject)
      • 获取指定键对应的值(QJsonValue)
      • 如果这个值是一个数组(QJsonArray),按照数组的解析方式来解析

      代码实现如下:

      QJsonObject object;
      if (m_document.isObject()) {
          object = m_document.object();
      }
      
      if (object.contains("member")) {
          QJsonArray array = object.value("member").toArray();
          qDebug() << array[0].toString();
          qDebug() << array[1].toString();
          qDebug() << array[2].toString();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
  • 相关阅读:
    【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅱ—— 创建和添加证书模板
    conda安装使用jupyterlab注意事项
    CAN(Controller Area Network)是一种用于在汽车和工业领域中进行通信的串行总线系统(附加案例)
    汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
    JAVA开发(开发工具与部署)
    input 只能输入正数并且只能保留3位小数且开头不能为0,并且表单多字段使用
    Nuxt - 页面缓存(从列表进入详情页返回后保持原来位置的搜索条件、结果数据、浏览器滚动条位置等)
    张量-类型转换函数
    如何下载MySQL的JDBC驱动包
    ESP32-C3入门教程 环境篇⑦——ESP-IDF构建自定义组件模板(components/CMakeLists)
  • 原文地址:https://blog.csdn.net/qq_44723937/article/details/126024041