2013-09-23 66 views
17

我使用的是Jackson 2.2.3,需要將JsonNode樹轉換爲帶有排序字段鍵的字符串。我完全不清楚如何做到這一點,特別是因爲相反如此簡單 - JsonNode jn = ObjectMapper.readTree(String s)Jackson JsonNode用已排序的鍵字符串

看來正確的方法是void writeTree(JsonGenerator jgen,JsonNode rootNode)。但是,我看不到從JsonGenerator獲得序列號String的方法。我認爲SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS仍然適用,因爲JsonGenerator.Feature s沒有這個選項。有沒有更簡單的方法來做到這一點 - 或者,如果沒有,我如何從JsonGenerator檢索序列化的字符串?

回答

27

這是最簡單的方法來做到這一點,由傑克遜的作者之一提供。目前沒有辦法直接從JsonNodeString排序鍵。

private static final ObjectMapper SORTED_MAPPER = new ObjectMapper(); 
static { 
    SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); 
} 

private String convertNode(final JsonNode node) throws JsonProcessingException { 
    final Object obj = SORTED_MAPPER.treeToValue(node, Object.class); 
    final String json = SORTED_MAPPER.writeValueAsString(obj); 
    return json; 
} 
+0

有沒有辦法對JSON中的數組進行排序呢?如果你有json數組,那麼這個解決方案不起作用:'{id:1,collection:[z,y]}'如果bacame'{collection:[z,y],id:1} *根本沒有訂購! :( – Cherry

+1

@Cherry在序列化之前通常需要對數組進行排序,傑克遜需要對地圖進行排序的原因是因爲地圖沒有固有的排序方式,所以應用程序可以在序列化爲JSON之前根據需要對數組進行排序。對於地圖來說是不可能的(一般來說)。 – elhefe