2012-02-28 137 views
9

我試圖用Jackson替換Groovy/grails項目中的自定義JSON(德)序列化。序列化的JSON與排序的鍵,使用傑克遜

我很難讓傑克遜輸出一個漂亮打印的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似乎打算做到這一點,但沒有出於某種原因。你知道這是爲什麼嗎?我在上面做錯了什麼?

我試過用傑克遜1.8.3,1.8.8和1.9.5,相同的結果(隨機密鑰)。

回答

4

documentationSORT_PROPERTIES_ALPHABETICALLY明確地說:

功能,定義了用於POJO的字段默認屬性串行化順序(注:不適用於地圖序列化)

所以我猜你將需要改變你的輸入Map(如你所說)

+0

好一點,我錯過了。看起來我可能不得不忘記設置序列化首選項的優雅方式。 – 2012-02-28 09:49:39

+1

你應該可以這樣做:'def jsonstring = mapper.defaultPrettyPrintingWriter()。writeValueAsString(mymap as TreeMap)'不是嗎? – 2012-02-28 10:04:46

+0

沒有,這沒有幫助。 'mymap'的實現不是TreeMap。即使是這樣,我也必須確保'mymap'中的所有其他映射值都是TreeMap,這就是非常棘手的地方。 – 2012-02-29 06:31:43

1

正如指出的那樣,這個功能只適用於POJO。但是,我認爲有一項功能請求可以爲Maps執行相同的功能,請登錄Jackson Jira;如果不是,這聽起來像是一個很好的補充。

但與此同時,我會第二次@tim_yates建議使用中間TreeMap進行排序,序列化:排序Map將按原樣使用,所以這應該工作。

13

正如@tim_yates所述,這不適用於映射鍵。

你可以使用

mapper.configure(SerializationConfig.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true) 
+0

對我來說'JSON_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true)'很好,這個回答非常有幫助:) – 2016-03-17 17:50:24

+0

好聽! :-)可以節省很多時間;-) – bknopper 2016-03-19 08:05:08

+2

謝謝!在v2.6.1中,它似乎已經被轉移到另一個包中。這對我有效:'mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);' – Tom 2016-05-25 06:14:49