简介
读Json除会用到写时需要的类,还需要QJsonParseError用于在将文件数据转换为Json格式数据时的错误接收。本章例子,将前面写到文件中的json读取到QJson中。
为了多次读方便,封装一个通用的读JSON函数,提供给下面的例子使用:
/**
* outDoc: 保存解析结果。
* fileName: 要解析的json文件名称
* return: 成功:true, 失败: false
*/
bool readFile(QJsonDocument& outDoc, const QString& fileName)
{
// 根据当前操作系统类型 设置字符集避免乱码
//if(QSysInfo::productType() == "windows")
// 打开json文件
QFile jsonFIle( QDir::homePath() + "/" + fileName );
if( !jsonFIle.open(QIODevice::ReadWrite))
{
qDebug() << "open file jsonObject.json error!";
return false;
}
QJsonParseError jsonParserError;
outDoc = QJsonDocument::fromJson(jsonFIle.readAll(),&jsonParserError);
jsonFIle.close();
// 文档不空 && jsonParserError解析没有错误,解析成功返回 true
return (!outDoc.isNull() && (jsonParserError.error == QJsonParseError::NoError));
}
第一个例子-对象
解析文件内容:
{
"age": 18.5,
"name": "tom",
"time": "Fri Jul 9 13:39:03 2021"
}
代码:
int readJson()
{
QJsonDocument jsonDoc;
if( !readFile(jsonDoc,"jsonObject.json"))
{
qDebug() << "read file error!";
return 1;
}
if(jsonDoc.isObject())
{
QJsonObject jsonObject = jsonDoc.object();
const QStringList&keys = jsonObject.keys();
for(const QString& key : keys)
{
qDebug() << "key: " << key << " value: " << jsonObject.value(key) << " isDouble: " << jsonObject.value(key).isDouble() << " isArray: " << jsonObject.value(key).isArray() << " isObject: " << jsonObject.value(key).isObject();
}
}
return 0;
}
结果:
第二个例子-数组
解析文件内容:
[
"name",
18,
"Fri Jul 9 14:17:31 2021"
]
代码:
int readJson()
{
QJsonDocument jsonDoc;
if( !readFile(jsonDoc,"jsonArray.json"))
{
qDebug() << "read file error!";
return 1;
}
// QJsonArray
if(jsonDoc.isArray())
{
QJsonArray jsonArray = jsonDoc.array();
for(int i = 0; i < jsonArray.size(); ++i)
{
qDebug() << "index " << i + 1 << " :" << jsonArray.at(i);
}
}
return 0;
}
结果:
第三个例子-对象与数组组合
解析文件内容:
( 文件结构:对象{ 数组[ 多个对象{},.... ] } )
{
"index:1": [
{
"age": 20,
"name": "tom",
"time": "Fri Jul 9 14:33:59 2021"
},
{
"age": 21,
"name": "bob",
"time": "Fri Jul 9 14:33:59 2021"
},
{
"age": 22,
"name": "lili",
"time": "Fri Jul 9 14:33:59 2021"
},
{
"size": 3
}
]
}
代码:
int readJson()
{
QJsonDocument jsonDoc;
if( !readFile(jsonDoc,"jsonExample.json"))
{
qDebug() << "read file error!";
return 1;
}
// QJsonObject + QJsonArray
if(jsonDoc.isObject())
{
QJsonObject jsonObject = jsonDoc.object();
const QStringList&keys = jsonObject.keys();
for(const QString& key : keys)
{
if(jsonObject.value(key).isArray())
{
qDebug() << "key: " << key;
QJsonArray jsonArray = jsonObject.value(key).toArray();
for(int i = 0; i < jsonArray.size(); ++i)
{
if(jsonArray.at(i).isObject())
{
QJsonObject arrayObject = jsonArray.at(i).toObject();
QStringList arrayObjectKeys = arrayObject.keys();
for(const QString& key : arrayObjectKeys)
{
qDebug() << "arrayObjKey :" << key << " value :" << arrayObject.value(key);
}
}
}
}
}
}
return 0;
}
结果:
代码优化
// 1 解析Json文件
int parserJson();
// 2 解析对象的函数
void parserObject(const QJsonObject& jsonObject);
// 3 解析数组的函数
void parserArray(const QJsonArray& jsonArray);
int main()
{
// 调用parserJson即可
parserJson();
return 0;
}
// 解析Json文件
int parserJson()
{
QJsonDocument jsonDoc;
if( !readFile(jsonDoc,"jsonExample.json"))
{
qDebug() << "read file error!";
return 1;
}
if(jsonDoc.isObject())
{
QJsonObject jsonObject = jsonDoc.object();
parserObject(jsonObject);
}
if(jsonDoc.isArray())
{
QJsonArray jsonArray = jsonDoc.array();
parserArray(jsonArray);
}
return 0;
}
// 解析对象的函数
void parserObject(const QJsonObject& jsonObject)
{
const QStringList&keys = jsonObject.keys();
for(const QString& key : keys)
{
QJsonValue jsonValue = jsonObject.value(key);
if(jsonValue.isArray())
{
parserArray(jsonValue.toArray());
}
else if(jsonValue.isObject())
{
parserObject(jsonValue.toObject());
}
else if( !jsonValue.isNull() && !jsonValue.isUndefined())
{
qDebug() << "key: " << key << "\tvalue:" << jsonValue;
}
}
}
// 解析数组的函数
void parserArray(const QJsonArray& jsonArray)
{
for(int i = 0; i < jsonArray.size(); ++i)
{
QJsonValue jsonValue = jsonArray.at(i);
if(jsonValue.isObject())
{
parserObject(jsonValue.toObject());
}
else if(jsonValue.isArray())
{
parserArray(jsonValue.toArray());
}
else if( !jsonValue.isNull() && !jsonValue.isUndefined())
{
qDebug() << "array value: " << jsonArray.at(i);
}
}
}
优化后的代码,可以对以上三种任何例子中的json文件解析。