最近在写一款通用的CAN设备上位机,需要用到JSON来存储文件,至于为什么用JSON?因为简单,性能不作要求,刚好之前也了解过JSON,所以就开干了,之前也考虑过xml,感觉不那么简单易懂,就放弃了。
在保存数据项的时候,发现我之前按顺序保存的数据,再次读取出来时,竟然有些不同。我原来的顺序是“1”,“2”,... ,"11"。但是到了"1",下一个却不是"2",而是"10",呃,这是给我按字母升序了。
去看了一下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的事实,不如坦然接受。既然他是按字母升序的,那就找出规则来。这个时候就上表格了
发现它是以前面的字母一一做比较的,如果第一位顺序相同,则比较第二位,如此类推。如果第一位对比的顺序不同,则不管后面的位数了 。如"10"与"2",先比较"1"与"2",发现"1"在"2"前面,就不管后面的"0"了,"10"就是排在"2"前面。
怎么办呢。那么就让第一位相同,后面的按顺序排序即可。使用表格验证,可以看到,无论是升序和降序,都是有序的的。
简单,新建一个数组,把这个值存进去,用的时候,变成字符串即可。
//我这里搞了一万个,因为我存储的个数不过超过这么多
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);
}