文章目錄
一、概述
從Qt5開始,官方就已經支持JSON格式的數據了,有關JSON的信息可以參考官網
JSON用於存儲結構化的數據,存儲的值有6種格式:
格式 | 類型 |
---|---|
bool | 布爾型 |
double | 數值型 |
string | 字符型 |
array | 數組型 |
object | 對象型 |
null | 空 |
bool值用“true / false”表示;數字的範圍時Qt支持的雙精度double範圍;string字符串是unicode;array數組是其他值類型的列表,用方括號"[]“表示;object對象是“鍵 / 值”對組合,且都是字符串,不能包含重複的key,用大括號”{}"表示。array和object中的條目用逗號分隔。如下是一個簡單的示例:
{
"FirstName" : "John",
"LastName" : "Doe",
"Age" : 43,
"Address" : {
"Street" : "Downing Street 10",
"City" : "London",
"Country" : "Great Britain"
},
"Phone numbers" : [
"+44 1234567",
"+44 2345678"
]
}
上面的示例由5個“鍵/值”對組成,其中:
(1)string類型;
(2)string類型;
(3)數字類型;
(4)對象類型;
(5)數組類型;
整個JSON文檔既可以是對象也可以是數組,因此最外圍可以用"[]“或”{}"。
二、Qt中的JSON類
類 | 功能 |
---|---|
QJsonValue | 封裝一個JSON值 |
QJsonArray | 封裝一個JSON數組 |
QJsonObject | 封裝一個JSON對象 |
QJsonDocument | 封裝一個JSON文檔 |
QJsonParseError | 封裝JSON時的錯誤 |
2.1、構建JSON
2.1.1、構建JSON對象
示例:
{
"key1" : "aaa",
"key2" : 24
}
代碼:
QJsonObject object;
object.insert("key1","aaa");
object.insert("key2",24);
QJsonDocument document;
document.setObject(object);
QByteArray array = document.toJson(QJsonDocument::Compact);
2.1.2、構建JSON數組
示例:
{
"Qt",
5.11,
true
}
代碼:
QJsonArray json;
json.append("Qt");
json.appent(5.11);
json.append(true);
QJsonDocument document;
document.setArray(json);
QByteArray array = document.toJson(QJsonDocument::Compact);
2.1.3 構建複雜的JSON串
示例:
{
"Compang" : "Digia",
"From" : 1991,
"Name" : "Qt",
"Page" : {
"Developers" : "https://www.qt.io/developers/",
"Download" : "https://www.qt.io/download/",
"Home" : "https://www.qt.io/"
}
"Version" : [
4.8,
5.2,
5.11
]
}
上述示例有5個“鍵/值對”對象,所以要分別構造,然後拼接起來
代碼:
//構建JSON對象 Page
QJsonObject pageObject;
pageObject.insert("Home","https://www.qt.io/");
pageObject.insert("Download","https://www.qt.io/download/");
pageObject.insert("Developers","https://www.qt.io/developers/");
//構建JSON數組 Version
QJsonArray versionArray;
versionArray.append(4.8);
versionArray.append(5.2);
versionArray.appeng(5.11);
//構建JSON對象
QJsonObject json;
json.insert("Name","Qt");
json.insert("Company","Digia");
json.insert("From",1991);
json.insert("Version",QJsonValue(versionArray));
json.insert("Page",QJsonValue(pageObject));
QJsonDocument document;
document.setObject(json);
QByteArray array = document.toJson(QJsonDocument::Compact);
2.2、解析JSON
一般我們接收到的JSON串用QByteArray來 存儲。
2.2.1、解析JSON對象
示例:
{
"key1" : "aaa",
"key2" : 24
}
代碼:
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(byteArray,&jsonError); //轉化爲JSON文檔
if(!document.isNull() && (QJsonParseError.error==QJsonParseError::NoError)); //解析未發生錯誤
{
if(document.isObject())
{
QJsonObject object = document.object();
//第一項
if(object.contains("key1"))
{
QJsonValue value = object.value("key1");
if(value.isString())
{
QString strName = value.toString();
qDebug()<<strName;
}
}
//第二項
if(object.contains("key2"))
{
QJsonValue value = object.value("key2");
if(value.isDouble())
{
int strName = value.toVariant().toInt();
qDebug()<<strName;
}
}
}
}
注意:在轉化爲QJsonDocument後,首先需要根據QJsonParseError的值判斷是否轉化成功,然後再進行相應的轉化解析。
2.2.2、解析JSON數組
示例:
{
"Qt",
5.11,
true
}
代碼:
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(byteArray,&jsonError); //轉化爲JSON文檔
if(!document.isNull() && (QJsonParseError.error==QJsonParseError::NoError)); //解析未發生錯誤
{
if(document.isArray())
{
QJsonArray array = document.array();
int nSize = array.size();
for(int i=0;i<nSize;i++)
{
QJsonValue value = array.at(i);
if(value.type()==QJsonValue::String)
QString strName = value.toString();
if(value.type()==QJsonValue::Double)
double dVersion = value.todouble();
if(value.type()==QJsonValue::Bool)
bool bCrossPlatform = value.toBool();
}
}
}
注意:和JSON對象類似,在遍歷數組時,獲取每個value,首先判斷value的類型(和is***()函數類似,這裏根據type()函數返回的枚舉值來判斷),然後再進行相應的轉換。
2.2.3、解析複雜的JSON串
示例:
{
"Compang" : "Digia",
"From" : 1991,
"Name" : "Qt",
"Page" : {
"Developers" : "https://www.qt.io/developers/",
"Download" : "https://www.qt.io/download/",
"Home" : "https://www.qt.io/"
}
"Version" : [
4.8,
5.2,
5.11
]
}
代碼:
QJsonParseError jsonError;
QJsonDocument document = QJsonDocument::fromJson(byteArray,&jsonError); //轉化爲JSON文檔
if(!document.isNull() && (QJsonParseError.error==QJsonParseError::NoError)); //解析未發生錯誤
{
if(document.isObject())
{
QJsonObject object = document.object();
if(objet.contains("Company"))
{
QJsonValue value = object.value("Company");
if(value.isString())
QString strName = value.toString();
}
if(objet.contains("Name"))
{
QJsonValue value = object.value("Name");
if(value.isString())
QString strName = value.toString();
}
if(objet.contains("From"))
{
QJsonValue value = object.value("From");
if(value.isDouble())
int nFrom= value.toVariant().toInt();
}
if(object.contains("Page"))
{
QJsonObject object1 = document.object();
//第一項
if(object1.contains("Developers"))
{
QJsonValue value = object.value("Developers");
if(value.isString())
{
QString strName = value.toString();
qDebug()<<strName;
}
}
//第二項
if(object1.contains("Download"))
{
QJsonValue value = object.value("Download");
if(value.isString())
{
QString strName = value.toString();
qDebug()<<strName;
}
}
//第三項
if(object1.contains("Home"))
{
QJsonValue value = object.value("Home");
if(value.isString())
{
QString strName = value.toString();
qDebug()<<strName;
}
}
}
if(object.contains("Version"))
{
QJsonValue value = object.value("Version");
if(value.isArray())
{
QJsonArray array = document.array();
int nSize = array.size();
for(int i=0;i<nSize;i++)
{
QJsonValue value = array.at(i);
if(value.isDouble())
double dVersion = version.toDouble();
}
}
}
}
}