提要

程序编号后自己模拟的数据程序在生成和解析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_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;
}
  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涉及到公司,就没全部贴,详情涉及太多。仅以记录。

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

  1. Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上

    提要 当程序关闭后再次打开程序需要加载上一次的按钮名称设置. 思路 关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下 ...

  2. MySQL5.7修改了my.ini文件后服务启动不了

    MySQL5.7修改了my.ini文件后服务启动不了 为了再数据库存储一些稀奇古怪的字符串,修改了数据库安装目录中的my.ini文件 直接打开(windows10),默认记事本,打开之后找到mysql ...

  3. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

  4. winform6、(C#)程序开机启动时读取文件失败

    winform6.(C#)程序开机启动时读取文件失败 今天在测试程序的时候发现,通过注册表来开机自启动程序时,读取不到配置文件,最后终究是发现了问题所在: 程序中使用了相对路径,而通过注册表启动时程序 ...

  5. 如何在ASP.NET Core程序启动时运行异步任务(1)

    原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...

  6. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  7. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  8. 程序启动时,vc2015设置哪个窗体先打开,优先启动,设置方法

    程序启动时,vc2015设置哪个窗体先打开,设置方法 工程名对应的APP文件中 InitInstance中 //Caccess_mdb_operationDlg dlg;  //可以设置这里,首先启动 ...

  9. 2.实验室打卡精灵2.0-单实例化、开机启动、托盘操作、程序启动时隐藏主窗口

    老规矩,上一张图片 最近对实验室打卡精灵做了一些优化,基本上达到了最初设想的功能. 现在的功能包括: 1.自定义早上.中午.下午.晚上的打卡时间 2.软件单实例化,即如果已经运行了一次再次运行会弹出& ...

最新文章

  1. object expected错误解决方法
  2. Python 之 matplotlib (十一) 3D
  3. unity开宝箱动画_[技术博客]Unity3d 动画控制
  4. 多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...
  5. Python chr / ord 函数区别和使用 - Python零基础入门教程
  6. 非导向传输媒体| 计算机网络
  7. python logging打印终端_python中那些小众但有用的自带标准库
  8. Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
  9. USBCAN、CAN分析仪、CANCANFD综合测试分析软件LKMaster主要功能一览
  10. python内置函数dict()
  11. oracle rac查看节点及宕库
  12. 时间序列分析——第三章 资产收益率序列
  13. python 批量去掉语音中的静音段
  14. 吊打何同学?B 站 UP 主 24 小时肝出 AirDesk 平替,成本 6000!
  15. 李维看 .net 和 DELPHI 6 (含李维照片) (转)
  16. 规划计算机网络需要考虑,论计算机网络规划及实现
  17. 《0~3岁孩子的 正面管教》——备忘
  18. 2018-CVPR-Harmonious Attention Network for Person Re-Identification
  19. mysql启动失败 查看日志文件_mysql诊断启动问题、查看日志文件详解
  20. MuleSoft知识总结-11.Mule基本组件(Transform Message)

热门文章

  1. 聚焦业务价值:分众传媒在 Serverless 上的探索和实践
  2. 「技术人生」第3篇:解决问题的规律总结
  3. 漫画通信:一图看懂通信发展史
  4. 迪士尼自研算法突破百万高清像素用AI换脸来拍电影
  5. 机器学习在高德起点抓路中的应用实践
  6. IoT SaaS加速器——助力阿尔茨海默病人护理
  7. 技术三板斧:关于技术规划、管理、架构的思考
  8. 锐捷发布极简以太全光解决方案 打造“不一样”的全光网
  9. 微服务化后缓存怎么做?
  10. php开发api数据加密,php-app开发接口加密