问题的提出:
QJsonObject写入读出json文件中文乱码。
复现步骤:
当json串很长时,我们一般采用流的形式写入文本,否则会截断导致写入不全,如下为将一个很长的json字符串写入qsModelFilePath文件保存。
QFile file(qsModelFilePath);
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
{
qDebug() << "file error!";
gpMessageHandler->addErrorMessage(STR("保存模型时出错"));
CMsgBox(STR("保存模型时出错"), this).Exec();
return;
}
QTextStream jsonStream(&file);
//jsonStream.setCodec("UTF-8");//处理utf8中文
jsonStream << strModelJson;
file.close(); // 关闭file
如下为将上述的qsModelFilePath文件中的json读出来:
QFile jsonFile(qsJsonFilePath);
jsonFile.open(QIODevice::ReadOnly);
QString strModelJson;
QTextStream jsonStream(&jsonFile);
//jsonStream.setCodec("UTF-8");//处理utf8中文
while (!jsonStream.atEnd())
{
QString qsLineText = jsonStream.readLine();
strModelJson.append(qsLineText);
}
strModelJson = strModelJson.toLower();
strModelJson = strModelJson.replace(',', ','); // 防止在配置文件中输入中文逗号
jsonFile.close();
// 使用json文件对象加载字符串
QJsonParseError error;
// 使用静态函数获取 QJsonDocument 对象
QJsonDocument jsonDocument = QJsonDocument::fromJson(strModelJson.toUtf8(), &error);
// 判断是否对象
if (!jsonDocument.isObject() || ( error.error != QJsonParseError::NoError))
{
return QJsonObject();
}
QJsonObject docObject = jsonDocument.object();
QString strAbsoluteDir = docObject[g_pszAbsoluteDir].toString();
上述保存写入json串到文件、从文件读取json到QString必须都要加入下述代码:
jsonStream.setCodec("UTF-8");//处理utf8中文
即将上面的该句注释取消才能保证读取json到QString代码段中提取json串中含有中文字段的信息不乱码(如下例,strAbsoluteDir 中含有中文):
QString strAbsoluteDir = docObject[g_pszAbsoluteDir].toString();
也就是说为了保证读取出的信息中文不乱码,必须在保存写入json字符串到文件和从文件读取json到QString两端都加入如下代码:
jsonStream.setCodec("UTF-8");//处理utf8中文
两端任何一端缺少该句,都会引起乱码