QJsonObject读出json文件使用中文字符串作为key出现乱码问题
QString m_jsonFile("~/untitled/templates.json");
QJsonObject m_jsonRoot;
QJsonDocument jsonDocument;
QFile jsonFile(m_jsonFile);
if (!jsonFile.exists()) {
return;
}
jsonFile.open(QIODevice::ReadOnly);
if (!jsonFile.isOpen()) {
return;
}
QByteArray ba = jsonFile.readAll();
QJsonParseError error;
jsonDocument = QJsonDocument::fromJson(ba, &error);
m_jsonRoot = jsonDocument.object();
QJsonObject userNode = m_jsonRoot.value(USERTEMPLATES).toObject();
QJsonObject userNode = userNode.value("模板 5").toObject(); //这里取值会失败
templates.json文件
{
"UserTemplates": {
"模板 1": "2022-03-30 19:50:23 564",
"模板 2": "2022-03-30 19:50:23 564",
"模板 3": "2022-03-30 19:50:23 564",
"模板 4": "2022-03-30 19:50:23 564",
"模板 5": "2022-03-30 19:50:23 564",
"模板 6": "2022-03-30 19:50:23 564",
"模板 7": "2022-03-30 19:50:23 564",
"模板 8": "2022-03-30 19:50:23 564",
"模板 9": "2022-03-30 19:50:23 564",
"模板 10": "2022-03-30 19:50:23 564",
"模板 11": "2022-03-30 19:50:23 564",
"模板 12": "2022-03-30 19:50:23 564",
"模板 13": "2022-03-30 19:50:23 564",
"模板 14": "2022-03-30 19:50:23 564",
"模板 15": "2022-03-30 19:50:23 564",
"模板 16": "2022-03-30 19:50:23 564",
"模板 17": "2022-03-30 19:50:23 564",
"模板 18": "2022-03-30 19:50:23 564"
}
}
现象
1、“模板“替换为英文就没问题
2、删掉几个就没问题
3、从qt5.15换到qt5.11环境就没问题
//直接使用m_jsonRoot = jsonDocument.object()在qt5.15版本上对中文字符串作为key支持不好,
//会出现userNode.value(key)查找不到的问题,使用以下方法构造的m_jsonRoot则不会出现该问题
QJsonObject tmpJsonRoot = jsonDocument.object();
QJsonObject userNode = tmpJsonRoot.value(USERTEMPLATES).toObject();
for (QJsonObject::iterator it = userNode.begin(); it != userNode.end(); it++) {
QJsonObject templateNode = it.value().toObject();
QJsonObject node;
node.insert(TEMPLATEID, templateNode.value(TEMPLATEID).toString());
node.insert(TEMPLATEPATH, templateNode.value(TEMPLATEPATH).toString());
node.insert(TEMPLATETIME, templateNode.value(TEMPLATETIME).toString());
QJsonObject userNode = m_jsonRoot.value(USERTEMPLATES).toObject();
userNode.insert(it.key(), node);
m_jsonRoot.insert(USERTEMPLATES, userNode);
}
QJsonObject node = userNode.value("模板 5").toObject(); //这里取值会没问题
参考:
qt 创建和解析中文字符 json
QT之QJson传输和中文乱码解决方案