我正在尝试用Jackson替换groovy / grails项目中的自定义JSON(de)序列化。
我无法让杰克逊输出一个漂亮的JSON,其中的键按照简单的“自然”字母顺序排序。 我试过这个(以及很多变化):
mymap = [ ... ] // Some groovy map
def mapper = new ObjectMapper()
mapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true)
def jsonstring = mapper.defaultPrettyPrintingWriter().writeValueAsString(mymap)
但杰克逊顽固地生成一个JSON,其中键似乎是随机顺序。 我尝试用TreeMap更改'mymap'的类型,在这种情况下,所有键都按预期正确排序。
我想知道是否有办法将键排序而不是将上面的'mymap'更改为TreeMap(并递归地将其所有地图值...)。
SORT_PROPERTIES_ALPHABETICALLY似乎是为了做到这一点,但由于某些原因它没有这样做。 你知道为什么吗?我上面做错了什么?
我尝试过Jackson 1.8.3,1.8.8和1.9.5,结果相同(随机键)。
答案 0 :(得分:16)
如@tim_yates所述,这对地图键不起作用。
您可以使用
mapper.configure(SerializationConfig.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true)
对于较新版本(> = 2.6.1),API已更改为:
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
答案 1 :(得分:4)
SORT_PROPERTIES_ALPHABETICALLY
的{{3}}明确说:
定义用于POJO字段的默认属性序列化顺序的功能(注意:不适用于地图序列化!)
所以我想你需要改变你的输入Map(如你所说)
答案 2 :(得分:1)
正如所指出的,此功能仅适用于POJO。但是,我认为有一项功能请求可以在Jackson Jira处为地图执行相同操作。如果没有,这听起来像是一个很好的补充。
但与此同时,我将第二次@tim_yates建议使用中间TreeMap进行排序,序列化:按顺序使用Map的顺序,所以这应该有效。