欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

Qt json文件读写

最后更新 2020-09-22 02:49:47   阅读量 1392

Qt提供了处理JSON数据的支持。JSON是一种数据编码格式派生自Javascript,现在在internet上广泛用作数据交换格式。 Qt中的JSON支持提供了一个易于使用的C++ API来解析、修改和保存JSON数据。 它还支持以二进制格式保存数据,这种格式可以直接“mmap”,而且访问速度非常快。

简单封装一下json字符串和QVariantMap之间的转换:

QVariantMap json2map(const QByteArray &val) {
    QJsonParseError jError;
    QJsonDocument jDoc = QJsonDocument::fromJson(val, &jError);
    if (jError.error == QJsonParseError::NoError) {
        if (jDoc.isObject()) {
            QJsonObject jObj = jDoc.object();
            return jObj.toVariantMap();
        }
    }
    QVariantMap ret;
    return ret;
}

QString json2str(const QVariantMap &val) {
    QJsonObject jobj = QJsonObject::fromVariantMap(val);
    QJsonDocument jdoc(jobj);
    return QString(jdoc.toJson(QJsonDocument::Indented)); // 为了易于阅读加上了缩进
}

json字符串:

{
    "current": 1,
    "groupList": [
        {
            "list": [
                "556",
                "766959751",
                "543",
                "619",
                "630",
                "488",
                "24"
            ],
            "name": "44"
        },
        {
            "list": [
                "556",
                "766959751",
                "543",
                "619",
                "630",
                "488",
                "24"
            ],
            "name": "分组一"
        }
    ]
}

定义如下结构:

    struct BrokerGroupData {
        int current = -1;
        QList<QPair<QString, QStringList>> groupList;

        void fromJson(const QByteArray &str);
        QString toJson() const;
    };
    
    void BrokerGroupData::fromJson(const QByteArray &str) {
    QVariantMap mp = json2map(str);
    bool ok = false;
    int currentRow = mp["current"].toInt(&ok);
    if (ok) {
        this->current = currentRow;
    }

    this->groupList.clear();
    QList<QVariant> groupList = mp["groupList"].toList();
    foreach(const QVariant &group, groupList) {
        QVariantMap &groupMp = group.toMap();
        QString name = groupMp["name"].toString();
        QStringList brokerList = groupMp["list"].toStringList();
        this->groupList.append(qMakePair(name, brokerList));
    }
}

QString BrokerGroupData::toJson() const {
    QVariantMap mp;
    mp["current"] = this->current;
    QList<QVariant> groupList;
    for (int i = 0; i < this->groupList.size(); i++) {
        QVariantMap groupMp;
        groupMp["name"] = this->groupList[i].first;
        groupMp["list"] = this->groupList[i].second;
        groupList.append(groupMp);
    }
    mp["groupList"] = groupList;
    return json2str(mp);
}

json文件读写:

// 读取
    QString brokergroupPath = "brokergroup.json";
    QFile file(brokergroupPath);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        return;
    }
    
    BrokerGroupData data;
    data.fromJson(file.readAll());
    
// 写入
    QString brokergroupPath = "brokergroup.json"
    QFile file(brokergroupPath);
    if (!file.open(QFile::WriteOnly | QFile::Truncate | QFile::Text)) {
        return;
    }

    BrokerGroupData data;
    // ... data对象赋值
    QTextStream in(&file);
    in.setCodec("utf-8");
    in << data.toJson();
    in.flush();
    file.close();

注意json字符串写入文件的时候一定要指定为utf8编码,否则如果字符串中有中文,从文件中读取json字符串后转换为对象的时候会失败。

(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – 字符编码的故事
上一篇 – QTableWidget整行高亮去虚线,样式定制

  1. Qt
  2. C/C++

toningto@outlook.com

推荐文章

Effective Python

Python的几种函数参数类型

标签云

MongoDB Mobile Boost Javascript Android Bug Mac Qt Windows Go Shell IOS Others Java Tools Design Tips Product Database Node.js Linux Python C/C++ Web MQ Life React

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2