Qt--JSON詳解

一、概述

從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();
				}	
			}
		}
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章