qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码

提要

程序编号后自己模拟的数据程序在生成和解析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文件的模式,可以正常运行。

乱码是由于编码格式,文件叠加是因为没有在新建时将上一次的文件内容清空。

  1. 编码
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;
}
  1. 文件存在则清空,不存在则新建
    创建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涉及到公司,就没全部贴,详情涉及太多。仅以记录。

上一篇:QtControlCenter-master(智能快递柜上位机-传感器串口通信-场景页面交互-页面美化)


下一篇:QT 5.8 用QNetwork 上传图片到php服务器,并通过url下载图片