json格式簡介
一、json格式簡介
1、概念
JSON是一種輕量級的數據交換格式,採用key-value鍵值對的方式來存儲數據,主要用於網絡通訊傳輸、本地配置文件等,易於人閱讀和編寫。
2、json中的對象和數組
對象:採用大括號{},括起來,中間的以key-value的形式存儲,形如{“name”:“ISmileLi”}。
數組:採用中括號[],括起來,中間的存儲數據以逗號,分割開,形如[toby,ISmileLi]。
對象和數組之間可以相互嵌套使用。
二、Qt框架對json格式的主要支持類(以下說明根據官方文檔翻譯整理)
1、QJsonDocument類
QJsonDocument類提供了一種讀寫JSON文檔的方法。
QJsonDocument是一個類,它包裝一個完整的JSON文檔,可以從UTF-8編碼的基於文本的表示以及Qt自己的二進制格式讀寫該文檔。
可以使用QJsonDocument::from JSON()將JSON文檔,從基於文本的表示形式轉換爲QJsonDocument,使用toJson()將其轉換回文本,解析器非常快速和高效,並將JSON轉換爲Qt使用的二進制表示。
可以使用isNull()查詢解析文檔的有效性!
可以使用isArray()和isObject()查詢文檔是否包含數組或對象。文檔中包含的數組或對象可以使用array()或object()檢索,然後讀取或操作。
也可以使用fromBinaryData()或fromRawData()從存儲的二進制表示創建文檔。
2、QJsonObject類
QJsonObject類封裝了一個JSON對象。
JSON對象是鍵-值對的列表,其中鍵是唯一的字符串,值由QJsonValue表示。
QJsonObject可以與QVariantMap進行轉換。它提供了size、insert、remove等方法供使用並使用標準的C++迭代器模式迭代其內容。
QJsonObject是一個隱式共享的類,只要不修改它,它就與從中創建的文檔共享數據。
可以通過QJsonDocument將對象轉換爲基於文本的JSON或者反向轉換。
3、QJsonArray類
QJsonArray類封裝了一個JSON數組。
JSON數組是一個值列表。可以通過從數組中插入和刪除QJsonValue來操作列表。
QJsonArray可以與QVariantList進行轉換。它提供了size、insert、remove等方法供使用,並使用標準的C++迭代器模式迭代其內容。
QJsonArray是一個隱式共享的類,只要不修改它,它就可以與QJsonDocument創建的文檔共享數據。
可以通過QJsonDocument將數組轉換爲基於文本的JSON或者反向轉換。
4、QJsonValue類
QJsonValue類用JSON封裝一個值。
JSON是一種存儲結構化數據的格式。它有6種基本數據類型:
布爾(Bool)、雙精度(Double)、字符串(String)、數組(Array)、對象(Object)、空(Null)。
值可以表示上述任何數據類型。此外,QJsonValue還有一個特殊的標誌來表示未定義的值,可以使用isUndefined()查詢。
可以使用type()或訪問器(如isBool()、isString()等)查詢值的類型。同樣,可以使用toBool()、toString()等將值轉換爲存儲在其中的類型。
值在內部是嚴格類型化的,與QVariant相反,它不會嘗試進行任何隱式類型轉換。這意味着轉換爲不存儲在值中的類型將返回默認的構造返回值
三、Json格式的構建與解析
1、構建和解析的數據格式如下:
{
"ISmileLi": [{
"info": {
"id": "00000000",
"sex": "就不告訴你",
"age": "我還很年輕"
},
"location": {
"city": "BeiJing",
"country": "中國"
},
"profession": "programmer"
}]
}
2、構建與解析示例代碼:
#include <QtCore/QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
#include <QDebug>
//QString jsonStr = "{
//"ISmileLi": [{
// "info": {
// "id": "00000000",
// "sex" : "就不告訴你",
// "age" : "我還很年輕"
// },
// "location" : {
// "city": "BeiJing",
// "country" : "中國"
// },
// "profession" : "programmer"
//}]
//}";
QByteArray g_personByte;
// json格式的生成,返回QString類型是爲了方便測試
QString makeJsonData()
{
QJsonObject personObject;
QJsonArray personArray;
QJsonObject infoKeyObject;
QJsonObject infoValueObject;
infoValueObject.insert("id", "2020");
infoValueObject.insert("sex", QStringLiteral("就不告訴你"));
infoValueObject.insert("age", QStringLiteral("我還很年輕"));
infoKeyObject.insert("info", infoValueObject);
QJsonObject locationKeyObject;
QJsonObject locationValueObject;
locationValueObject.insert("city", "BeiJing");
locationValueObject.insert("country", "China");
locationKeyObject.insert("location", locationValueObject);
QJsonObject professionObject;
professionObject.insert("profession", "programmer");
personArray.insert(0, infoKeyObject);
personArray.insert(1, locationKeyObject);
personArray.insert(2, professionObject);
personObject.insert("ISmileLI", personArray);
if (personObject.isEmpty())
{
return "";
}
// 把json格式轉化成QString返回
QJsonDocument doc;
doc.setObject(personObject);
QByteArray personByte = doc.toJson(QJsonDocument::Compact);
// 賦值給全局的,用於解析測試使用,實際開發中請勿這麼幹啊!
g_personByte = personByte;
QString personStr = QString::fromStdString(personByte.toStdString());
return personStr;
}
// 解析json數據
bool analyseJsonData(QByteArray personByte)
{
QJsonParseError parseError;
QJsonDocument doc = QJsonDocument::fromJson(personByte,&parseError);
if (parseError.error != QJsonParseError::NoError)
{
return false;
}
if (doc.isObject())
{
QJsonObject personObject = doc.object();
if (personObject.contains("ISmileLI"))
{
QJsonArray personArray = personObject.value("ISmileLI").toArray();
for (int i = 0; i < personArray.size(); i++)
{
QJsonObject infoObject = personArray.at(i).toObject();
if (infoObject.contains("info"))
{
QJsonObject infoValueObject = infoObject.take("info").toObject();
int id = infoValueObject.value("id").toInt();
QString sexStr = infoValueObject.value("sex").toString();
QString ageStr = infoValueObject.value("age").toString();
qDebug() << "id: " << id << " sex:" << sexStr << " age:" << ageStr;
}
else if (infoObject.contains("location"))
{
QJsonObject locationObject = infoObject.take("location").toObject();
QString cityStr = locationObject.value("city").toString();
QString countryStr = locationObject.value("country").toString();
qDebug() << "city: " << cityStr << " country:" << countryStr;
}
else
{
QString professionStr = infoObject.take("profession").toString();
qDebug() << "profession: " << professionStr;
}
}
}
}
return true;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 構建json數據
qDebug() << QStringLiteral("-------------------------構建json數據---------------------------");
QString rootJsonStr = makeJsonData();
qDebug() << rootJsonStr;
qDebug() << QStringLiteral("-------------------------解析json數據---------------------------");
analyseJsonData(g_personByte);
return a.exec();
}
運行結果:
四、推薦一個在線的json格式驗證工具
1、json在線驗證:https://www.json.cn/
2、驗證效果:
能力有限,如有錯誤,多多指教。。。。