当前位置:   article > 正文

Qt中JSON的使用_qt json

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]
  • 1

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

[
	{
	"id":123,
	"name":"tom"
	},
	[1,2,3.14,"hello world",true,null]
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三.JSON对象:
JSON对象的格式:一个或多个键值对组成
示例1:

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

示例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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

小结: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": "公司"
        }
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

使用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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

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

{
	"name": "小王",
	"age": 30,
    "address": {
        "city": "北京",
        "street": "人民路32号"
    },
    "phoneNumbers": [
        {
            "number": "999-123456",
            "type": "家"
        },
        {
            "number": "999-654321",
            "type": "公司"
        }
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

使用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;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/1016482
推荐阅读
相关标签
  

闽ICP备14008679号