Qt实现对json文件的解析

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

发布了83 篇原创文章 · 获赞 34 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xx18030637774/article/details/104734317
今日推荐