Qt Json

Qt 中用 json 就是這麼簡單, 使用 QVariant , 強烈推薦, 五星級推薦
不要談效率, 二進制(protobuf 等) 比 json 快. 只講便捷.

例如:

{
	"hai": "QQ",
	"ye": [
		4, 1, 9, 0, 8, 7, 1, 3, 7
	]
}

這裏可以對 json 格式化校驗: http://www.bejson.com/

    //構造
    //口訣: 遇到 { 括號用 QVariantMap
    //      遇到 [  括號用 QVariantList
    // 是不是超簡單?
    QVariantMap map;
    map.insert("hai","QQ");

    QVariantList yeList;
    QStringList list;
    list<<"4"<<"1"<<"9"<<"0"<<"8"<<"7"<<"1"<<"3"<<"7";
    for(int i=0; i<list.size(); ++i){
        yeList.append(QString(list.at(i)).toInt());
    }
    map.insert("ye",yeList);
    QByteArray jsonByteArray = qVariantToByteArray(map);
    qDebug()<<"map:"<<map;
    qDebug()<<"json:"<<QString(jsonByteArray);
    
    //解析:
    //口訣: 遇到 { 括號就 .toMap()
    //     遇到 [  括號就 .toList()
    QVariant jsonVar = getJsonVariant(jsonByteArray);
    qDebug()<<"hai:"<<jsonVar.toMap().value("hai").toString();
    QVariantList reYeList = jsonVar.toMap().value("ye").toList();
    qDebug()<<"ye:"<<reYeList;
    foreach (auto var, reYeList) {
        qDebug()<<var.toInt();
    }

輸出:

Starting D:\QtDemo\2019\10\build-MyCobomBox-Qt_5_12_1_mingw73_64-Release\release\MyCobomBox.exe...
map: QMap(("hai", QVariant(QString, "QQ"))("ye", QVariant(QVariantList, (QVariant(int, 4), QVariant(int, 1), QVariant(int, 9), QVariant(int, 0), QVariant(int, 8), QVariant(int, 7), QVariant(int, 1), QVariant(int, 3), QVariant(int, 7)))))
json: "{\n    \"hai\": \"QQ\",\n    \"ye\": [\n        4,\n        1,\n        9,\n        0,\n        8,\n        7,\n        1,\n        3,\n        7\n    ]\n}\n"
hai: "QQ"
ye: (QVariant(int, 4), QVariant(int, 1), QVariant(int, 9), QVariant(int, 0), QVariant(int, 8), QVariant(int, 7), QVariant(int, 1), QVariant(int, 3), QVariant(int, 7))
4
1
9
0
8
7
1
3
7
#include <QVariantList>
#include <QVariantMap>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

//Json 文件轉成QVariant
QVariant getJsonVariant(const QString &filePath)
{
    QByteArray json;
    QFileInfo fileInfo(filePath);
    if(fileInfo.isFile()){
        QFile file(fileInfo.absoluteFilePath());
        if(file.open(QIODevice::ReadOnly)){
            json = file.readAll();
            file.close();
        }
    }else{
        qWarning()<<fileInfo.filePath()<<"is not a file";
    }
    return getJsonVariant(json);
}
//json 數據轉 QVariant
QVariant getJsonVariant(const QByteArray &json)
{
    QJsonParseError error;
    QVariant var;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(json, &error);

    if (error.error == QJsonParseError::NoError) {
        if (!(jsonDocument.isNull() || jsonDocument.isEmpty())) {
            if (jsonDocument.isObject()) {
                var = jsonDocument.toVariant().toMap();
            }else if(jsonDocument.isArray()){
                var = jsonDocument.toVariant().toList();
            }
        }else{
            qDebug()<<"jsonDocument.isEmpty()";
        }
    }else{
        qWarning()<<error.errorString().toUtf8().constData();
    }
    return var;
}

//QVariant to QByteArray
QByteArray qVariantToByteArray(const QVariant &var){

    QByteArray data;
    if(!var.isNull()){
        switch (var.type()) {
        case QVariant::ByteArray:
            data = var.toByteArray();
            break;
        case QVariant::Map:
        case QVariant::List:
            data = QJsonDocument::fromVariant(var).toJson(QJsonDocument::Indented);
            break;
        case QVariant::String:
            data = var.toString().toLocal8Bit();
            break;
        default:
            break;
        }
    }
    return data;
}

使用 QVariant 優點: Qt 內部數據傳輸,UI 控件數據綁定, 便捷不用二次轉換,對於比較大的json文件無法解析, 具體沒測試多大的文件.
缺點: 無法對 double 進行小數點截斷 (QJsonObject 也不行, 非官方 QJSON 可以)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章