Qt框架之解析和構建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、驗證效果:

在這裏插入圖片描述
能力有限,如有錯誤,多多指教。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章