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 可以)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值