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

Zor*_*mic 14 grails groovy json 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)
Run Code Online (Sandbox Code Playgroud)

但杰克逊顽固地生成一个JSON,其中键似乎是随机顺序.我尝试用TreeMap更改'mymap'的类型,在这种情况下,所有键都按预期正确排序.

我想知道是否有一种方法可以在将上面的'mymap'更改为TreeMap的情况下对键进行排序(并递归地将其所有的映射值...).

SORT_PROPERTIES_ALPHABETICALLY似乎是为了做到这一点,但由于某种原因它没有这样做.你知道为什么吗?我上面做错了什么?

我试过Jackson 1.8.3,1.8.8和1.9.5,结果相同(随机键).

bkn*_*per 19

正如@tim_yates所述,这对地图键不起作用.

你可以用

mapper.configure(SerializationConfig.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true)
Run Code Online (Sandbox Code Playgroud)

对于较新的版本(> = 2.6.1),API更改为:

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

  • 对我来说`JSON_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true)`效果很好,这个答案非常有帮助:) (2认同)
  • 谢谢!在v2.6.1中,它似乎已被移动到另一个包中.这对我有用:`mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);` (2认同)

tim*_*tes 5

文档SORT_PROPERTIES_ALPHABETICALLY明确地说:

功能,定义了用于POJO的字段默认属性串行化顺序(注:也不能适用于地图系列化!)

因此,我想您将需要更改输入地图(如您所说)