删除文章

确定要删除这篇文章吗?

取消
确定

Qt json文件读写

     阅读(82)  2020-09-22 02:49:47

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字符串后转换为对象的时候会失败。

文章评论

Keep it simple,stupid
文章数
348
今日访问
1104
今日IP数
542
最近评论

在家赚钱: 在家赚钱 <a href="http://www.265250.com/" >在家赚钱</a> 已阅,感谢站长分享!
liangzi: 不错 谢谢分享
tujiaw: registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx: 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun: 很不错,来围观一下
tujiaw: 抱歉csdn code服务关闭了,这个代码我也找不到了
回到顶部