使用Jackson对带有排序键的序列化JSON

时间:2012-02-28 04:31:17

标签: json grails groovy jackson

我正在尝试用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,结果相同(随机键)。

3 个答案:

答案 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的顺序,所以这应该有效。