Qt--JSON详解
原创
©著作权归作者所有:来自51CTO博客作者贝勒里恩的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
一、概述
从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数组
示例:
代码:
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数组
示例:
代码:
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();
}
}
}
}
}