Qt中JSON使用的详细步骤

 更新时间:2023年08月07日 09:43:15   作者:读书札记2022  
本文主要介绍了Qt中JSON使用的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.前言:

JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,还有一种数据传输格式XML,相较于XML,JSON更加便于阅读和书写。

JSON 有两种数据格式:JSON对象和JSON数组。被中括号包裹的是JSON数组,被大括号包裹的是JSON对象。

二.JSON数组:

JSON数组的格式:[元素1,元素2,元素3,…]

示例1:元素可以是不同数据类型

[1,2,3.14,"hello world",true,null]

示例2:元素可以是JSON对象或JSON数组

[
    {
    "id":123,
    "name":"tom"
    },
    [1,2,3.14,"hello world",true,null]
]

三.JSON对象:

JSON对象的格式:一个或多个键值对组成

示例1:

{
    "id":123,
    "name":"tom"
}

示例2:嵌套JSON对象和JSON数组,JSON对象和JSON数组也要使用键值对格式

{
  "name": "John Doe",
  "age": 30,
  "address": {
      "city": "New York",
    "street": "123 Main St"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "555-1234"
    },
    {
      "type": "work",
      "number": "555-5678"
    }
  ],
  "hobbies": ["reading", "painting", "playing guitar"],
  "isStudent": true
}

小结:JSON数组里可以包含JSON对象或JSON数组,JSON对象里也可以嵌套JSON对象或JSON数组。

四.Qt中JSON的使用

1.生成JSON数据
2.解析JSON数据

在QT5.0版本以后支持对JSON的使用,QT5.0之前需要自己集成第三方库。

1.生成JSON数据

要生成的JSON数据如下:

{
    "name": "小王",
    "age": 30,
    "address": {
        "city": "北京",
        "street": "人民路32号"
    },
    "phoneNumbers": [
        {
            "number": "999-123456",
            "type": "家"
        },
        {
            "number": "999-654321",
            "type": "公司"
        }
    ]
}

使用Qt生成上面的JSON数据:

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
void MainWindow::writeJSON()
{
    // 创建最外层的 JSON 对象,里面包含要构建的所有 JSON 数据
    QJsonObject rootObj;
    // 插入 name 键值对到 rootObj
    rootObj.insert("name","小王");
    // 插入 age 键值对到 rootObj
    rootObj.insert("age",30);
    // 创建地址 JSON 对象,里面包含两个键值对
    QJsonObject addressObj;
    addressObj.insert("city","北京");
    addressObj.insert("street","人民路32号");
    // 插入地址 JSON 对象到 rootObj
    rootObj.insert("address",addressObj);
    // 创建电话 JSON 数组,里面包含两个电话 JSON 对象
    QJsonArray phoneArray;
    // 创建两个电话 JSON 对象
    QJsonObject phoneHomeObj;
    phoneHomeObj.insert("type","家");
    phoneHomeObj.insert("number","999-123456");
    QJsonObject phoneWorkObj;
    phoneWorkObj.insert("type","公司");
    phoneWorkObj.insert("number","999-654321");
    // 在电话 JSON 数组中添加两个电话 JSON 对象
    phoneArray.append(phoneHomeObj);
    phoneArray.append(phoneWorkObj);
    // 插入电话 JSON 数组到 rootObj
    rootObj.insert("phoneNumbers",phoneArray);
    // 将 rootObj JSON对象转换为 JSON 数据格式
    QJsonDocument doc(rootObj);
    QByteArray json = doc.toJson();
    // 打印
    qDebug()<<QString::fromUtf8(json);
}

2.解析JSON数据

要解析的JSON数据如下,先将它放在test.json文本文件中:

{
    "name": "小王",
    "age": 30,
    "address": {
        "city": "北京",
        "street": "人民路32号"
    },
    "phoneNumbers": [
        {
            "number": "999-123456",
            "type": "家"
        },
        {
            "number": "999-654321",
            "type": "公司"
        }
    ]
}

使用Qt解析上面的JSON数据:

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
#include <QFile>
void MainWindow::analyseJSON()
{
    // 读取文本中的 JSON 数据
    QFile file("C:\\Users\\A\\Desktop\\temp\\test.json");
    file.open(QFile::ReadOnly);
    QByteArray json = file.readAll();
    file.close();
    // 将 JSON 数据转换为 QJsonDocument 对象
    QJsonDocument doc = QJsonDocument::fromJson(json);
    if(!doc.isObject())
    {// 不是 JSON 对象:JSON 字符串格式错误或无效
        qDebug()<<"不是 JSON 对象:JSON 字符串格式错误或无效";
        return;
    }
    // 将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象
    QJsonObject obj = doc.object();
    // 获取 JSON 数据中的所有键
    QStringList keys = obj.keys();
    // 遍历键值对
    for (int i = 0;i<keys.size();++i) 
    {
        // 获取每一个 key
        QString key = keys[i];
        // 通过 key 获取对应的 value
        QJsonValue value = obj.value(key);
        if(value.isBool())
        {// 值是一个 bool
            qDebug()<<key<<":"<<value.toBool();
        }
        else if(value.isString())
        {// 值是一个字符串
            qDebug()<<key<<":"<<value.toString();
        }
        else if(value.isDouble())
        {// 值是一个 double 或者 int(double 和 int 都用 isDouble)
            qDebug()<<key<<":"<<value.toInt();
        }
        else if(value.isObject())
        {// 值是一个 JSON 对象
            qDebug()<<key<<":";
            // 这里偷个懒,不再像上面那样循环获取值了,而是直接通过已知的键去获取值
            QJsonObject addressObj = value.toObject();
            QString city = addressObj["city"].toString();
            QString street = addressObj["street"].toString();
            qDebug()<<"  "<<"city:"<<city;
            qDebug()<<"  "<<"street:"<<street;
        }
        else if (value.isArray())
        {// 值是一个 JSON 数组
            qDebug()<<key<<":";
            QJsonArray phoneArray = value.toArray();
            for (int i = 0;i<phoneArray.size();++i) 
            {// 遍历 JSON 数组中的每一个 JSON 对象
                QJsonObject phoneObj = phoneArray[i].toObject();
                QString number = phoneObj["number"].toString();
                QString type = phoneObj["type"].toString();
                qDebug()<<"  "<<"number:"<<number;
                qDebug()<<"  "<<"type:"<<type;
            }
        }
    }
}

到此这篇关于Qt中JSON的使用的文章就介绍到这了,更多相关Qt JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一波二叉树遍历问题的C++解答实例分享

    一波二叉树遍历问题的C++解答实例分享

    这篇文章主要介绍了一波二叉树遍历问题的C++解答实例分享,包括节点打印和转换为镜像等问题的解答,需要的朋友可以参考下
    2016-02-02
  • C++超详细分析单链表的实现与常见接口

    C++超详细分析单链表的实现与常见接口

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本章带你分析单链表的实现与常见接口
    2022-03-03
  • wince程序防止创建多个实例实现互斥作用

    wince程序防止创建多个实例实现互斥作用

    什么时候用的互斥?当你的程序只允许同时打开一个的时候,就可以通过互斥来实现,下面说的互斥,主要是针对防止程序创建多个实例这种情况来实现的
    2014-02-02
  • C语言连接MySQL数据库的完整流程

    C语言连接MySQL数据库的完整流程

    本文详细介绍了C语言连接MySQL数据库的完整流程,从库文件配置,编译运行,再到 API 函数详解和完整代码实战,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-05-05
  • C++与QML进行数据交互实现方式介绍

    C++与QML进行数据交互实现方式介绍

    迫于无奈开始写android的程序,以前使用QWidget的方式试过,虽然界面可以实现,但是最后调用摄像头时,未能成功,再没有继续。这几天开始使用qml进行尝试,在使用的过程中,其中的一个难点,就是在qml与c++中数据的交互
    2022-09-09
  • C++20中的span容器及用法小结

    C++20中的span容器及用法小结

    std::span 是一个非常实用的工具,可以方便地对数据进行访问和处理,同时也可以提高代码的可读性、可维护性和安全性,这篇文章主要介绍了C++20中的span容器,需要的朋友可以参考下
    2023-03-03
  • C++使用opencv读取图片的操作代码(图像处理)

    C++使用opencv读取图片的操作代码(图像处理)

    这篇文章主要介绍了C++使用opencv读取图片,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 深入解析C语言中typedef的四个用途

    深入解析C语言中typedef的四个用途

    以下是对C语言中typedef的四个用途进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C++实现LeetCode(166.分数转循环小数)

    C++实现LeetCode(166.分数转循环小数)

    这篇文章主要介绍了C++实现LeetCode(166.分数转循环小数)
    2021-07-07
  • C语言入门篇--字符串的基本理论及应用

    C语言入门篇--字符串的基本理论及应用

    本篇文章是c语言基础篇,主要为大家介绍了C语言中字符串的基本理论及应用,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08

最新评论