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

项目场景:

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


问题描述

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

QT中的JSON存储时无序问题的思考与解决_第1张图片

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

QT_BEGIN_NAMESPACE
class QDebug;
template  class QMap;
typedef QMap QVariantMap;
template  class QHash;
typedef QHash QVariantHash;

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


解决方案:

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

QT中的JSON存储时无序问题的思考与解决_第2张图片

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

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

QT中的JSON存储时无序问题的思考与解决_第3张图片

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

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

 

//我这里搞了一万个,因为我存储的个数不过超过这么多
for (int i = 10000; i < 20000; ++i)
		fIndex[i - 10000] = i;

/*******************
 ......一些代码
********************/

for (int k = 0; k < pGboleData.at(i).cItem.at(j).pItem.size(); k++)
{
				 QJsonArray pItem;
				/*******************
                     ......一些代码
                 ********************/

				for(int v=0;v< sspro.size();v++)
				{
					QJsonArray itemarr;
					/*******************
                     ......一些代码
                    ********************/
					//这里的key用我们生成的来代替数组
					cellPr.insert(QString::number(fIndex[v]), itemarr);
					//ibegin++;
				}
				
				pItem.append(cellPr);
                //这里的key用我们生成的来代替数组
				pDItem.insert(QString::number(fIndex[k]), pItem);
}

你可能感兴趣的:(编译器OR日常心得,json,qt,c++)