json是一种轻量级的数据结构,其内部的结构是一种键值对(key-value)的组合,最外层是{ }。key是带双引号的字符串常亮,用于获取和存储;value的值可以是bool变量,字符串常量,对象或数组(也是一个key-value的组合,以 [ 开头,以 ] 结尾),具体json格式介绍可参考博客:https://www.cnblogs.com/hwtblog/p/8483573.html
Qt中提供QJsonDocument,QJsonValue,QJsonObject,QjsonArray等类来实现对json文件的解析。以下面的json为例子,实现对json文件中数据的解析。
{
“tunning params array” : [
{
"anc auto tuning filter count: 0,
"anc mode" : "FFMode",
"anc params array" : [
{
"bypass" : true,
"frequency": 5000,
},
{
"bypass" : false,
"frequency": 1000,
}
]
},
{
"anc auto tuning filter count: 1,
"anc mode" : "FBMode",
"anc params array" : [
{
"bypass" : true,
"frequency": 5000,
},
{
"bypass" : false,
"frequency": 1000,
}
]
}
]
}
实现对json文件数据的读取,具体实现的API如下所示:
#include <QList>
#include <QString>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonValue>
struct AncParameter {
bool bypass;
int frequency;
};
struct TuningParameter {
int ancAutoTuningFilterCount;
QList<AncParameter> ancParaArray;
QString ancMode;
};
QList<AncParameter> readParamsFromJsonFile(QString jsonFile)
{
QList<AncParameter> result;
//打开json文件,读取所有数据
QFile file(jsonFile);
if (!file.open(QIODevice::ReadOnly)) return result;
QByteArray allData = file.readAll();
file.close();
//读取具体的json数据
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(allData, &jsonError);
if (jsonError != QJsonParseError.NoError) return result;
if (!jsonDoc.isObject()) return result;
QJsonObject rootObject = jsonDoc.object();
if (rootObject.contains("tunning params array")) {
QJsonValue ancTuningParaArray = rootObject.value("tunning params array");
if (ancTuningParaArray.isArray()) {
QJsonArray tuningParameterArray = ancTuningParaArray.toArray();
for (int i = 0; i < tuningParameterArray.count(); i++) {
QJsonValue tuningPara = tuningParameterArray[i];
if (tuningPara.isObject()) {
TuningParameter tuningParameter;
QJsonObject tuningParameterObject = tuningPara.toObject();
if (tuningParameterObject.contains("anc auto tuning filter count")) {
QJsonValue ancAutoTuningFilterCount = tuningParameterObject.value("anc auto tuning filter count");
if (ancAutoTuningFilterCount.isDouble())
tuningParameter.ancAutoTuningFilterCount = (int)ancAutoTuningFilterCount.toDouble();
} else if (tuningParameterObject.contains("anc mode")) {
QJsonValue ancMode = ancParameterObject.value("anc mode");
if (ancMode.isString()) {
QString ancModeString = ancMode.toString();
if (QString::compare("FFMode", ancModeString, Qt::CaseInsensitive))
tuningParameter.ancMode = "FFMode";
else
tuningParameter.ancMode = "FBMode";
}
} else if (tuningParameterObject.contains("anc params array")) {
QJsonValue ancParameterArray = tuningParameterObject.value("anc params array");
if (ancParameterArray.isArray()) {
QJsonArray ancArray = ancParameterArray.toArray();
for (int i = 0; i < ancArray.count(); i++) {
AncParameter ancParameter;
QJsonValue ancParaValue = ancArray[i];
if (ancParaValue.contains("bypass")) {
QJsonValue bypassValue = ancParaValue.value("bypass");
if (bypassValue.isBool())
ancParameter.bypass = bypassValue.toBool();
} else if (ancParaValue.contains("frequency")) {
QJsonValue frequencyValue = ancParaValue.value("frequency");
if (frequencyValue.isDouble())
ancParameter.bypass = (int)frequencyValue.toDouble();
}
tuningParameter.ancParaArray.append(ancParameter);
}
}
}
result.append(tuningParameter);
}
}
}
}
return result;
}
至于对json文件的存取,就是将list中的输入数据写入到 json文件中,原理类似。