Qt中JSON使用的詳細(xì)步驟
一.前言:
JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,還有一種數(shù)據(jù)傳輸格式XML,相較于XML,JSON更加便于閱讀和書寫。
JSON 有兩種數(shù)據(jù)格式:JSON對(duì)象和JSON數(shù)組。被中括號(hào)包裹的是JSON數(shù)組,被大括號(hào)包裹的是JSON對(duì)象。
二.JSON數(shù)組:
JSON數(shù)組的格式:[元素1,元素2,元素3,…]
示例1:元素可以是不同數(shù)據(jù)類型
[1,2,3.14,"hello world",true,null]
示例2:元素可以是JSON對(duì)象或JSON數(shù)組
[
{
"id":123,
"name":"tom"
},
[1,2,3.14,"hello world",true,null]
]三.JSON對(duì)象:
JSON對(duì)象的格式:一個(gè)或多個(gè)鍵值對(duì)組成
示例1:
{
"id":123,
"name":"tom"
}示例2:嵌套JSON對(duì)象和JSON數(shù)組,JSON對(duì)象和JSON數(shù)組也要使用鍵值對(duì)格式
{
"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
}小結(jié):JSON數(shù)組里可以包含JSON對(duì)象或JSON數(shù)組,JSON對(duì)象里也可以嵌套JSON對(duì)象或JSON數(shù)組。
四.Qt中JSON的使用
1.生成JSON數(shù)據(jù)
2.解析JSON數(shù)據(jù)
在QT5.0版本以后支持對(duì)JSON的使用,QT5.0之前需要自己集成第三方庫。
1.生成JSON數(shù)據(jù)
要生成的JSON數(shù)據(jù)如下:
{
"name": "小王",
"age": 30,
"address": {
"city": "北京",
"street": "人民路32號(hào)"
},
"phoneNumbers": [
{
"number": "999-123456",
"type": "家"
},
{
"number": "999-654321",
"type": "公司"
}
]
}使用Qt生成上面的JSON數(shù)據(jù):
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
void MainWindow::writeJSON()
{
// 創(chuàng)建最外層的 JSON 對(duì)象,里面包含要構(gòu)建的所有 JSON 數(shù)據(jù)
QJsonObject rootObj;
// 插入 name 鍵值對(duì)到 rootObj
rootObj.insert("name","小王");
// 插入 age 鍵值對(duì)到 rootObj
rootObj.insert("age",30);
// 創(chuàng)建地址 JSON 對(duì)象,里面包含兩個(gè)鍵值對(duì)
QJsonObject addressObj;
addressObj.insert("city","北京");
addressObj.insert("street","人民路32號(hào)");
// 插入地址 JSON 對(duì)象到 rootObj
rootObj.insert("address",addressObj);
// 創(chuàng)建電話 JSON 數(shù)組,里面包含兩個(gè)電話 JSON 對(duì)象
QJsonArray phoneArray;
// 創(chuàng)建兩個(gè)電話 JSON 對(duì)象
QJsonObject phoneHomeObj;
phoneHomeObj.insert("type","家");
phoneHomeObj.insert("number","999-123456");
QJsonObject phoneWorkObj;
phoneWorkObj.insert("type","公司");
phoneWorkObj.insert("number","999-654321");
// 在電話 JSON 數(shù)組中添加兩個(gè)電話 JSON 對(duì)象
phoneArray.append(phoneHomeObj);
phoneArray.append(phoneWorkObj);
// 插入電話 JSON 數(shù)組到 rootObj
rootObj.insert("phoneNumbers",phoneArray);
// 將 rootObj JSON對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)格式
QJsonDocument doc(rootObj);
QByteArray json = doc.toJson();
// 打印
qDebug()<<QString::fromUtf8(json);
}2.解析JSON數(shù)據(jù)
要解析的JSON數(shù)據(jù)如下,先將它放在test.json文本文件中:
{
"name": "小王",
"age": 30,
"address": {
"city": "北京",
"street": "人民路32號(hào)"
},
"phoneNumbers": [
{
"number": "999-123456",
"type": "家"
},
{
"number": "999-654321",
"type": "公司"
}
]
}使用Qt解析上面的JSON數(shù)據(jù):
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
#include <QFile>
void MainWindow::analyseJSON()
{
// 讀取文本中的 JSON 數(shù)據(jù)
QFile file("C:\\Users\\A\\Desktop\\temp\\test.json");
file.open(QFile::ReadOnly);
QByteArray json = file.readAll();
file.close();
// 將 JSON 數(shù)據(jù)轉(zhuǎn)換為 QJsonDocument 對(duì)象
QJsonDocument doc = QJsonDocument::fromJson(json);
if(!doc.isObject())
{// 不是 JSON 對(duì)象:JSON 字符串格式錯(cuò)誤或無效
qDebug()<<"不是 JSON 對(duì)象:JSON 字符串格式錯(cuò)誤或無效";
return;
}
// 將 QJsonDocument 對(duì)象中的 JSON 數(shù)據(jù)轉(zhuǎn)換為 JSON 對(duì)象
QJsonObject obj = doc.object();
// 獲取 JSON 數(shù)據(jù)中的所有鍵
QStringList keys = obj.keys();
// 遍歷鍵值對(duì)
for (int i = 0;i<keys.size();++i)
{
// 獲取每一個(gè) key
QString key = keys[i];
// 通過 key 獲取對(duì)應(yīng)的 value
QJsonValue value = obj.value(key);
if(value.isBool())
{// 值是一個(gè) bool
qDebug()<<key<<":"<<value.toBool();
}
else if(value.isString())
{// 值是一個(gè)字符串
qDebug()<<key<<":"<<value.toString();
}
else if(value.isDouble())
{// 值是一個(gè) double 或者 int(double 和 int 都用 isDouble)
qDebug()<<key<<":"<<value.toInt();
}
else if(value.isObject())
{// 值是一個(gè) JSON 對(duì)象
qDebug()<<key<<":";
// 這里偷個(gè)懶,不再像上面那樣循環(huán)獲取值了,而是直接通過已知的鍵去獲取值
QJsonObject addressObj = value.toObject();
QString city = addressObj["city"].toString();
QString street = addressObj["street"].toString();
qDebug()<<" "<<"city:"<<city;
qDebug()<<" "<<"street:"<<street;
}
else if (value.isArray())
{// 值是一個(gè) JSON 數(shù)組
qDebug()<<key<<":";
QJsonArray phoneArray = value.toArray();
for (int i = 0;i<phoneArray.size();++i)
{// 遍歷 JSON 數(shù)組中的每一個(gè) JSON 對(duì)象
QJsonObject phoneObj = phoneArray[i].toObject();
QString number = phoneObj["number"].toString();
QString type = phoneObj["type"].toString();
qDebug()<<" "<<"number:"<<number;
qDebug()<<" "<<"type:"<<type;
}
}
}
}到此這篇關(guān)于Qt中JSON的使用的文章就介紹到這了,更多相關(guān)Qt JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++超詳細(xì)分析單鏈表的實(shí)現(xiàn)與常見接口
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,本章帶你分析單鏈表的實(shí)現(xiàn)與常見接口2022-03-03
wince程序防止創(chuàng)建多個(gè)實(shí)例實(shí)現(xiàn)互斥作用
什么時(shí)候用的互斥?當(dāng)你的程序只允許同時(shí)打開一個(gè)的時(shí)候,就可以通過互斥來實(shí)現(xiàn),下面說的互斥,主要是針對(duì)防止程序創(chuàng)建多個(gè)實(shí)例這種情況來實(shí)現(xiàn)的2014-02-02
C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹
迫于無奈開始寫android的程序,以前使用QWidget的方式試過,雖然界面可以實(shí)現(xiàn),但是最后調(diào)用攝像頭時(shí),未能成功,再?zèng)]有繼續(xù)。這幾天開始使用qml進(jìn)行嘗試,在使用的過程中,其中的一個(gè)難點(diǎn),就是在qml與c++中數(shù)據(jù)的交互2022-09-09
C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))2021-07-07

