在杰克逊图书馆进行分类,不指定POJO



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

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

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

  1. ORDER_MAP_ENTRIES_BY_KEYS
  2. 按字母排序

我写了一些单元测试,发现它可以按预期工作。但我想知道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);
}

记住,这是内部的&在以后的版本中,实现可能会发生更改。

最新更新