问题描述
我想知道 jackson 库中的排序是如何工作的。 我有一个像下面这样的 json(不存在与此 json 等效的 POJO),我想对数组“ItemProps”进行排序,即使有时它可能包含不同顺序的属性。
{
"ItemId":"<item_id>","ItemProps":[
{
"key":"property_key","value":"property_value"
},{
"key":"property_key","value":"property_value"
}
]
经过大量阅读,我发现这可以通过将属性设置为 true 来创建确定性映射器对象来实现
- ORDER_MAP_ENTRIES_BY_KEYS
- SORT_PROPERTIES_ALPHABETICALLY
我编写了一些单元测试并发现它按预期工作。 但我想知道 ItemProps 的排序是如何在内部工作的? 是由
- 单个 json 对象的哈希码
- 将一个或多个字段作为参考并进行比较?
我搜索了它,但找不到任何内容。 任何文章或答案的任何指示都会有所帮助。 谢谢。
但我仍然很好奇这种排序是如何工作的。
解决方法
您可以从 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);
}
请记住,这是内部的,在以后的版本中实现可以更改。