Loading

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"
             }
    }
    

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

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


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

    [
      "a", 1, true, null,
      {
         "name":"1",
         "key":"123"
      },
      [1,2,3]
    ]
    

    如上所示,这里就是一个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. 解析基本的数组

    ["ZhangSan","Lisi","WangWu"]
    

    解析步骤为:

    • 获取对应的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();
    }
    
  2. 解析基本的对象

    {
      "name":"Zhangsan",
      "id":"1"
    }
    

    解析步骤为:

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


    代码实现如下:

    // 开始解析
    QJsonObject object;
    if (m_document.isObject()) {
        object = m_document.object();
    }
    
    foreach (QString key, object.keys()) {
        qDebug() << object.value(key).toString();
    }
    
  3. 解析JSON数组组合JSON对象

    [
      {
        "name":"Zhangsan",
        "id":"1"
      }, {"name":"Lisi",
        "id":"2"
      }, {
        "name":"Wangwu",
        "id":"2"
      }
    ]
    

    解析步骤为:

    • 获取对应的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();
            }
        }
    }
    
  4. 解析JSON对象组合JSON数组

    {
      "type":"1",
      "member":["Zhangsan", "Lisi", "Wangwu"]
    }
    

    解析步骤为:

    • 获取对应的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();
    }
    
posted @ 2022-09-03 19:46  师从名剑山  阅读(857)  评论(0编辑  收藏  举报