qtjson写文件保持顺序怎么操作?处理json的顺序性

阳光 2021-07-02 18:27:16 java常见问答 7560

qtjson写文件的时候,如果能够保持顺序操作那么这样开发起来会提高工作效率,但是要想保持顺序操作还是有些困难的,那qtjson写文件保持顺序怎么操作?下面来我们就来给大家讲解一下。

1. 保持json有序的思路

首先,我们要澄清有序性的概念:从某种程度上,我们可以把json看作是一个个的kv组成的数据,从这个层面上来讲,我们可以把有序性定义为json的key保持有序,先假设为字典序吧,那么就说这个json数据是有序的。

其次,因为json的数据支持嵌套,所以,我们应该需要保持每一层的数据都有序,才是完整有序的。

ok, 理解完有序的概念,下面我们来看看如何实现有序?

json本身是不可能保持有序了,所以,当我们自行写入json数据时,只需要按照 abcde... 这种key顺序写入数据,那么得到的最终json就是有序的。

但我们一般都是使用对象进行程序变换的,所以,就应该要从对象中取出有序的key, 然后序列化为json.

这里保持有序,至少有两个层面的有序:1. kv形式的key的有序; 2. 列表形式的数据有序; 还有其他可能非常复杂的有序性需求,比如按照某字段有序,倒序。所以,想保持json有序很简单,保证有序写入就可以了。

2. 保持json有序的应用场景举例

为什么要保持json有序呢?json相当于kv数据,一般情况下我们是不需要保证有序的,但有些特殊情况下也许有用。比如我有两份json数据,我想比较它们是否是相等的时候!

比如第一份数据是 {"a":1, "b":2}, 第二份数据是 {"b":2, "a":1}, 那么你说这两份数据是否是相等的呢?相等或不相等依据是啥?

如果对于固定数据结构的json, 那么也许我们可以直接取出每个key的值,然后进行比较,全部相等则相等成立,否则不相等。

但对于json本身就是各种不确定的数据组成,如果我们限制死必须取某些key, 那么这个通用性就很差了。所以,我们要想比较两个json是否相等,还应该要有另外的依据。

另外,当我们将有序json写入文件之后,当key的数据非常多时,有序实际上可以辅助我们快速找到对应的key所在的位置。这是有序性带来的好处,快速查找!

比如下面的例子,对比两个结果集是否相等,你觉得结果当如何呢?

@Test
public void testJsonObjectOrder()
{
    String res1, res2;
    List < map > nList;
    Mapdata = new HashMap < > ();
    data.put("d", "cd");
    data.put("a", 1);
    data.put("b", 0.45);
    data.put("total", 333);
    List < map > list = new ArrayList < > ();
    Mapitem1 = new HashMap < > ();
    item1.put("aa", 1);
    item1.put("ee", 5);
    item1.put("bb", 6);
    item1.put("nn", null);
    list.add(item1);
    Mapitem2 = new HashMap < > ();
    item2.put("xxx", "000");
    item2.put("q", 2);
    item2.put("a", "aa");
    list.add(item2);
    data.put("sub", list);
    MapnData = new HashMap < > (data)
    nData.put("c", null);
    nData.put("abc", null);
    res1 = JSONObject.toJSONString(data);
    res2 = JSONObject.parseObject(JSONObject.toJSONString(nData))
        .toJSONString();
    Assert.assertEquals("序列化结果不相等default", res1, res2);
    res2 = JSONObject.toJSONString(JSONObject.parseObject(
            JSONObject.toJSONString(nData, SerializerFeature.SortField))
        , SerializerFeature.SortField);
    Assert.assertEquals("序列化结果不相等sort", res1, res2);
    nList = new ArrayList < > ();
    nList.add(item2);
    nList.add(item1);
    nData.put("sub", nList);
    res2 = JSONObject.parseObject(JSONObject.toJSONString(nData))
        .toJSONString();
    Assert.assertEquals("序列化结果不相等array", res1, res2);
}

如果想保持顺序操作的话,可以使用保持json有序的思路或者保持json有序的应用场景举例,这样就能达到效果哦!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

json的使用方法是什么?Json怎么理解?

java怎么制作时钟?java时钟实例

java中index是什么意思?java中“index=-1”怎么理解?