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";elsetuningParameter.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文件中,原理类似。