文章目录

一、概述

从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();
}
}
}
}
}