相关文章推荐
纯真的熊猫  ·  elementui的table列超出隐藏to ...·  1 年前    · 
傻傻的凳子  ·  postgresql中常用的函数:lengt ...·  1 年前    · 
谦逊的电梯  ·  idea设置主题与字体格式:字号、加粗,去掉 ...·  1 年前    · 
跑龙套的凉茶  ·  获取outputstream大小_Java精 ...·  2 年前    · 
温文尔雅的花生  ·  GitLab Pages | GitLab·  2 年前    · 
小百科  ›  Qt解析JSON - 师从名剑山
博客园 对象数组 array
有腹肌的香烟
7 月前
  • Qt解析JSON
    • QT 解析json的三件套,QJsonDocument、QJsonObject、QJsonArray、QJsonValue
      • 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();
        
 
推荐文章
纯真的熊猫  ·  elementui的table列超出隐藏tooltip悬浮显示问题_vue.js_脚本之家
1 年前
傻傻的凳子  ·  postgresql中常用的函数:length、concat、as、substring、random_postgre length-CSDN博客
1 年前
谦逊的电梯  ·  idea设置主题与字体格式:字号、加粗,去掉屏幕中间的白色竖线 - 知乎
1 年前
跑龙套的凉茶  ·  获取outputstream大小_Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)..._weixin_39550486的博客-CSDN博客
2 年前
温文尔雅的花生  ·  GitLab Pages | GitLab
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号