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