
1.导入QJSON库
QJson已经在QT5中集成到了QtCore模块中,在使用QJson时不需要额外引入其它模块。
C++常用的Json库:JsonCpp,CJSON,QJson
QJsonArray:json数组类,类似QVariantList
QJsonObject:json对象类,类似QVariantMap
QJsonDocument:json文档类,主要将用于转换json与ByteArray格式数据
2.数据写入
2.1 QJsonObject
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 在home路径创建test.json文件,以读写方式打开
QFile file(QDir::homePath() + "/jsonObject.json");
if( !file.open(QIODevice::ReadWrite) )
{
qDebug() << "file open error!";
return 1;
}
// 使用QJsonObject对象插入键值对。(写入文件中与代码中,不能保证成员顺序一致。实际是保存到了QVariantMap中)
QJsonObject jsonObject;
jsonObject.insert("name","tom");
jsonObject.insert("age",18.5);
jsonObject.insert("time",QDateTime::currentDateTime().toString());
// 创建Json文档对象,将Json对象设置到文档对象中,写入到文件时使用文档的 QJsonDocument::toJson()方法,将Json数据转换为字节数组
QJsonDocument jsonDoc;
jsonDoc.setObject(jsonObject);
file.write(jsonDoc.toJson());
file.close();
qDebug() << "write to file done.";
return a.exec();
}
jsonObject.json文件内容:
{
"age": 18.5,
"name": "tom",
"time": "Fri Jul 9 10:30:34 2021"
}
2.2 QJsonArray
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile fileArray(QDir::homePath() + "/jsonArray.json");
if( !fileArray.open(QIODevice::ReadWrite))
{
qDebug() << "file open error!";
return 1;
}
// 使用JsonArray添加值并写入文件(写入文件中的与代码中的顺序一致,实际是保存到了QVariantList中)
QJsonArray jsonArray;
jsonArray.append("name");
jsonArray.append(18);
jsonArray.append(QDateTime::currentDateTime().toString());
QJsonDocument jsonArrayDoc;
jsonArrayDoc.setArray(jsonArray);
fileArray.write(jsonArrayDoc.toJson());
fileArray.close();
qDebug() << "write jsonArray to file done.";
return a.exec();
}
jsonArray.json文件内容
[
"name",
18,
"Fri Jul 9 10:30:34 2021"
]
2.3 JsonObject与JsonArray结合使用例子
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile fileExample(QDir::homePath() + "/JsonExample.json");
if( !fileExample.open(QIODevice::ReadWrite))
{
qDebug() << "JsonExample file open error!";
return 1;
}
QJsonArray exampleArray;
int baseAge = 20;
char* names[] = {"tom" , "bob", "lili"};
// 将每个对象放入json数组中
for(int i = 0; i < 3; ++i)
{
QJsonObject exampleObject;
exampleObject.insert("name",names[i]);
exampleObject.insert("age",baseAge + i);
exampleObject.insert("time",QDateTime::currentDateTime().toString());
exampleArray.append(exampleObject);
}
// 向数组中放不同类型的jsonObject
QJsonObject sizeJson;
sizeJson.insert("size",exampleArray.size());
exampleArray.append(sizeJson);
// 将json数组放入json对象中
QJsonObject jsonArrayObject;
jsonArrayObject.insert("index:1",exampleArray);
// 写入到打开的文档fileExample中
QJsonDocument exampleJsonDoc;
exampleJsonDoc.setObject(jsonArrayObject);
fileExample.write(exampleJsonDoc.toJson());
fileExample.close();
qDebug() << "write fileExample to file done.";
return a.exec();
}
JsonExample.json文件内容:
{
"index:1": [
{
"age": 20,
"name": "tom",
"time": "Fri Jul 9 10:30:34 2021"
},
{
"age": 21,
"name": "bob",
"time": "Fri Jul 9 10:30:34 2021"
},
{
"age": 22,
"name": "lili",
"time": "Fri Jul 9 10:30:34 2021"
},
{
"size": 3
}
]
}
3.数据读取
3.1 封装函数
读Json除会用到写时需要的类,还需要QJsonParseError用于在将文件数据转换为Json格式数据时的错误接收
为了多次读方便,封装一个通用的读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));
}
3.2 对象
解析文件内容:
{
"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;
}
结果:

3.3 数组
解析文件内容:
[
"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;
}
结果:

3.4 对象与数组组合
解析文件内容:
( 文件结构:对象{ 数组 多个对象{},.... } )
{
"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文件解析。