提要
程序编号后自己模拟的数据程序在生成和解析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_PUToutPut<<"文件路径及名称:"<<fileName;
#endifQTextCodec *code = QTextCodec::codecForName("GBK");QFile file(fileName);if (!file.open(QIODevice::ReadOnly)){
#ifdef OUT_PUToutPut<<QString("%1配置文件读取失败!").arg(fileName);
#endifreturn allData;}allData = file.readAll();QString str = code->toUnicode(allData);file.close();
#ifdef OUT_PUT
// outPut<<"json文件内容:"<<allData;
#endifreturn 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涉及到公司,就没全部贴,详情涉及太多。仅以记录。