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;
            }
        }
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt,可以使用Qt提供的Json类来组织和解析数据。Qt从版本5.0开始提供了对Json的支持。主要有四个与Json相关的类常用:QJsonDocument、QJsonArray、QJsonObject和QJsonValue。 QJsonDocument类封装了一个完整的JSON文档,可以从基于文本的UTF-8编码的表示以及Qt的二进制格式读取和写入该文档。 QJsonArray表示JSON数组,是一个值的列表。可以通过插入和删除QJsonValue来操作该列表。 QJsonObject表示JSON对象,是键值对的列表,其键是唯一的字符串,值由QJsonValue表示。 QJsonValue类封装了JSON支持的数据类型。 QJsonParseError类用于报告JSON解析过程的错误。 对于Json使用,可以参考以上提到的类的文档和相关函数进行操作,根据具体的需求进行数据的组织和解析。Json格式的数据在Qt可以方便地进行处理,并且由于Json的数据格式与语言无关,因此在QtJson使用具有广泛的应用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【QTQt Json 的操作](https://blog.csdn.net/qq_43331089/article/details/124582761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Qt专栏】QtJson使用教程](https://blog.csdn.net/weixin_43729127/article/details/127522889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值