【问题标题】:Sorting in Jackson Library W/O POJO Specified在没有指定 POJO 的杰克逊图书馆中排序
【发布时间】:2021-09-10 16:27:05
【问题描述】:

我想知道 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. 将一个或多个字段作为参考并进行比较?

我搜索了它,但找不到任何东西。 任何指向任何文章或答案的指针都会有所帮助。 谢谢。

但我仍然对这种排序的工作原理感到好奇。

【问题讨论】:

    标签: java json jackson jackson-databind fasterxml


    【解决方案1】:

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

    如果您没有将 map 反序列化为 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);
    }
    

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

    【讨论】:

    • 谢谢@aatwork,会看看它。仍然对选择 JSON 中的哪个字段进行排序感到好奇。 Deepdive 应该能找到答案。
    猜你喜欢
    • 2016-12-21
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多