杰克逊的地图 SORT_PROPERTIES_ALPHABETICALLY

Kir*_*ill 8 jackson

我使用杰克逊2.5.0。我想编写一个方法,它接受任意 JSON 字符串,并使用 Jackson 按字母顺序对每个属性进行排序。包括嵌套的。

我了解到 Jackson 的 ObjectMapper 有一个SORT_PROPERTIES_ALPHABETICALLY功能,我想使用它来实现我的目标。所以我基于这个想法的最初代码是:

class FooBar {
    String foo
    String bar
}

def sortFields(String source) {
    def om = new ObjectMapper().configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)

    def obj = om.readValue(source, Map.class)
    return om.writeValueAsString(obj)
}

println sortFields('{"foo":"f","bar":"b"}')
Run Code Online (Sandbox Code Playgroud)

请注意,我无法提前知道输入 JSON 具有什么结构,因此 Jackson 默认将其解组MapLinkedHashMap更准确地说)。我希望它输出一个字符串,其中键按字母顺序排序:

{"bar":"b","foo":"f"}

不幸的SORT_PROPERTIES_ALPHABETICALLY是,当要序列化的对象是Map. 如果我替换Map.classFooBar.classJSON 属性,将按预期排序。但正如我所说,我无法提前知道输入 JSON 的类型,也无法在代码中为任何可能的类型创建一个类。对于杰克逊我还有什么其他选择?

Jav*_*ier 4

这适用于顶级地图:

objectMapper.configure(
    SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true
);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,它不会对您可能拥有的任何潜在嵌套映射中的键进行排序。