QJSON的使用介绍之读篇

上一页:QJSON的使用介绍之写篇

简介

读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;
}

结果:

QJSON的使用介绍之读篇_第1张图片

代码优化

// 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文件解析。

你可能感兴趣的:(QT,c++,json)