提要
程序编号后自己模拟的数据程序在生成和解析json时都正常,但是换了一组数据,生成的json文件中部分中文乱码,且出现json文件的格式被混乱的现象。
效果
上述出现的不正确的json文件,如下:
{"btnInfo":[{"id":10005,"index":1,"name":"全屏马赛兢},{"id":10007,"index":2,"name":"20210128-SY"},{"id":10010,"index":3,"name":"PPT汇报-2"},{"id":10013,"index":4,"name":"安播例会"},{"id":10022,"index":5,"name":"中星6B/S6视频会议"}]}°媒体外罢},{"id":10061,"index":6,"name":"视频会议20210309"}]}
上述json文件的内容出现部分中问乱码,且json文件的格式也不正常。似乎是两个json文件叠加了。
问题
首先改json文件如下:
{
"jsonrpc": "2.0",
"method": "source.getSceneList",
"result": [
{"name": "楼宇1","id": "10001"},
{"name": "楼宇2","id": "10002"},
{"name": "楼宇3","id": "10003"},
{"name": "楼宇4","id": "10004"},
{"name": "楼宇5","id": "10005"},
{"name": "楼宇6","id": "10006"},
{"name": "楼宇7","id": "10007"},
{"name": "楼宇8","id": "10008"},
{"name": "楼宇9","id": "10009"},
{"name": "楼宇10","id": "10010"},
{"name": "楼宇11","id": "10011"},
{"name": "楼宇12","id": "10012"},
{"name": "楼宇巍峨","id": "10013"},
{"name": "楼宇即","id": "10014"},
{"name": "楼宇15","id": "10015"},
{"name": "楼宇16","id": "10016"},
{"name": "楼宇17","id": "10017"},
{"name": "楼宇18","id": "10018"},
{"name": "楼宇19","id": "10019"},
{"name": "楼宇20","id": "10020"},
{"name": "楼宇21","id": "10021"},
{"name": "楼宇时","id": "10019"},
{"name": "楼宇杜","id": "10020"},
{"name": "楼宇及对QP","id": "10021"},
{"name": "楼宇K-P蝴蝶飞","id": "10026"}],
"id": 0
}
通过点击界面上的按钮,按钮的文本如上name字段所示,生成json文件,下次程序启动的时候再将json文件中name字段按照上一次按钮的文本设置到按钮上。上述json文件生成后起初会出现中文为奇数时尾部中文乱码,中文为偶数时不乱码,后改变编码和创建json文件的模式,可以正常运行。
乱码是由于编码格式,文件叠加是因为没有在新建时将上一次的文件内容清空。
- 编码
void createJsonFile()
{
QJsonObject data;
QJsonObject subData1;
QJsonArray array;
int index;
QMap<int,stuSceNameId>::iterator it;
for(it = m_btnInfoMap.begin(); it != m_btnInfoMap.end(); ++it)
{
index = it.key();
stuSceNameId temp = *it;
subData1.insert("index",index);
subData1.insert("id",temp.id);
subData1.insert("name",QString::fromLocal8Bit(temp.name.toLocal8Bit()));
array.append(subData1);
}
data.insert("btnInfo",array);
QJsonDocument document;
document.setObject(data);
QByteArray jsonArray = document.toJson(QJsonDocument::Compact);
QString strJson(jsonArray);
QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";
QFile file(strName);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QString strTitle = "提示";
QString strContent = QString("%1文件打开失败!").arg(strName);
QMessageBox::information(this,strTitle,strContent);
return ;
}
QTextStream in(&file);
in<<strJson;
file.close();
}
先构建json结构,然后创建json文件,由于第三个字段name存在中文,所以将其转换为本地编码。读取json文件后再将其转换为utf-8编码.
QString byteArray = readSceneBtnInfo(strName);//从json文件中读取的字符串
outPut<<"读到的字符串:"<<byteArray;
if(byteArray.size() == 0)
{
return ;
}
QByteArray array = byteArray.toUtf8();
parseSceneBtnJson(array);
读取json文件的函数如下。
QString readSceneBtnInfo(QString fileName)
{
QByteArray allData;
#ifdef OUT_PUT
outPut<<"文件路径及名称:"<<fileName;
#endif
QTextCodec *code = QTextCodec::codecForName("GBK");
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
#ifdef OUT_PUT
outPut<<QString("%1配置文件读取失败!").arg(fileName);
#endif
return allData;
}
allData = file.readAll();
QString str = code->toUnicode(allData);
file.close();
#ifdef OUT_PUT
// outPut<<"json文件内容:"<<allData;
#endif
return str;
}
- 文件存在则清空,不存在则新建
创建json文件时将文件的打开模式改为以下就可实现文件不存在创建,文件存在则清空文件内容。
QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";
QFile file(strName);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QString strTitle = "提示";
QString strContent = QString("%1文件打开失败!").arg(strName);
QMessageBox::information(this,strTitle,strContent);
return ;
}
QTextStream in(&file);
in<<strJson;
file.close();
提示:
关于编码格式这块儿,作者表示不是很清楚,所以上面描述出错的地方还望更改。问题描述和现象有些乱,问题已解决,由于不是自己的demo涉及到公司,就没全部贴,详情涉及太多。仅以记录。