在 Jackson 库中排序 W/O POJO 指定

问题描述

我想知道 jackson 库中的排序是如何工作的。 我有一个像下面这样的 json(不存在与此 json 等效的 POJO),我想对数组“ItemProps”进行排序,即使有时它可能包含不同顺序的属性

{
  "ItemId":"<item_id>","ItemProps":[
     {
       "key":"property_key","value":"property_value"
     },{
       "key":"property_key","value":"property_value"
     }
   ]

经过大量阅读,我发现这可以通过将属性设置为 true 来创建确定性映射器对象来实现

  1. ORDER_MAP_ENTRIES_BY_KEYS
  2. SORT_PROPERTIES_ALPHABETICALLY

我编写了一些单元测试并发现它按预期工作。 但我想知道 ItemProps 的排序是如何在内部工作的? 是由

  1. 单个 json 对象的哈希码
  2. 一个或多个字段作为参考并进行比较?

搜索了它,但找不到任何内容。 任何文章或答案的任何指示都会有所帮助。 谢谢。

但我仍然很好奇这种排序是如何工作的。

解决方法

您可以从 jar 文件中查看源代码。我很好奇,只是看了看 jackson-databind-2.6.6.jar。

如果您没有将映射反序列化为 SortedMap 的实例,则 ORDER_MAP_ENTRIES_BY_KEYS 将使用 TreeMap 对其进行排序并返回排序结果。

 protected Map<?,?> _orderEntries(Map<?,?> input)
    {
        // minor optimization: may already be sorted?
        if (input instanceof SortedMap<?,?>) {
            return input;
        }
        return new TreeMap<Object,Object>(input);
    }

SORT_PROPERTIES_ALPHABETICALLY 还将使用 TreeMap 对结果进行排序。

int size = props.size();
Map<String,POJOPropertyBuilder> all;
// Need to (re)sort alphabetically?
if (sort) {
    all = new TreeMap<String,POJOPropertyBuilder>();
} else {
    all = new LinkedHashMap<String,POJOPropertyBuilder>(size+size);
}

请记住,这是内部的,在以后的版本中实现可以更改。