文章标题 原创 翻译 转载 文章内容 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字符串后转换为对象的时候会失败。 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交