C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt JSON

Qt中JSON使用的详细步骤

作者:读书札记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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文