• QT中的JSON存储时无序问题的思考与解决


    项目场景:

    最近在写一款通用的CAN设备上位机,需要用到JSON来存储文件,至于为什么用JSON?因为简单,性能不作要求,刚好之前也了解过JSON,所以就开干了,之前也考虑过xml,感觉不那么简单易懂,就放弃了。


    问题描述

    在保存数据项的时候,发现我之前按顺序保存的数据,再次读取出来时,竟然有些不同。我原来的顺序是“1”,“2”,... ,"11"。但是到了"1",下一个却不是"2",而是"10",呃,这是给我按字母升序了。

     去看了一下QT 的JSON头文件,果然,这家伙底层是用map实现的:

    1. QT_BEGIN_NAMESPACE
    2. class QDebug;
    3. template <class Key, class T> class QMap;
    4. typedef QMap QVariantMap;
    5. template <class Key, class T> class QHash;
    6. typedef QHash QVariantHash;

    在C++容器里面,map是属于无序的容器,会自动升序或者降序。呃,这就很痛苦了,,思索万千,掉了不少头发,因为QT的QJsonObject还没有关掉自动排序这个开关。。


    解决方案:

    想来想去,还是既然改变不了被BUG强J的事实,不如坦然接受。既然他是按字母升序的,那就找出规则来。这个时候就上表格了

    发现它是以前面的字母一一做比较的,如果第一位顺序相同,则比较第二位,如此类推。如果第一位对比的顺序不同,则不管后面的位数了 。如"10"与"2",先比较"1"与"2",发现"1"在"2"前面,就不管后面的"0"了,"10"就是排在"2"前面。

    怎么办呢。那么就让第一位相同,后面的按顺序排序即可。使用表格验证,可以看到,无论是升序和降序,都是有序的的。

     那么在代码中怎么使用呢?

    简单,新建一个数组,把这个值存进去,用的时候,变成字符串即可。

     

    1. //我这里搞了一万个,因为我存储的个数不过超过这么多
    2. for (int i = 10000; i < 20000; ++i)
    3. fIndex[i - 10000] = i;
    4. /*******************
    5. ......一些代码
    6. ********************/
    7. for (int k = 0; k < pGboleData.at(i).cItem.at(j).pItem.size(); k++)
    8. {
    9. QJsonArray pItem;
    10. /*******************
    11. ......一些代码
    12. ********************/
    13. for(int v=0;v< sspro.size();v++)
    14. {
    15. QJsonArray itemarr;
    16. /*******************
    17. ......一些代码
    18. ********************/
    19. //这里的key用我们生成的来代替数组
    20. cellPr.insert(QString::number(fIndex[v]), itemarr);
    21. //ibegin++;
    22. }
    23. pItem.append(cellPr);
    24. //这里的key用我们生成的来代替数组
    25. pDItem.insert(QString::number(fIndex[k]), pItem);
    26. }

  • 相关阅读:
    redis集群模式详解
    vue源码解析
    PostgreSQL修炼之道笔记之准备篇(一)
    Netty inEventLoop方法的思想延伸
    【对比Java学Kotlin】协程-创建和取消
    牛客网-《刷C语言百题》第二期
    QT 实现mysql的长连接
    深度学习中模块设计汇总(一)
    GNU ld链接器 lang_process()(二)
    神经网络 深度神经网络,深度神经网络工作原理
  • 原文地址:https://blog.csdn.net/liyangbinbin/article/details/126753951