2013-09-23 24 views
17

Jackson 2.2.3 kullanıyorum ve bir JsonNode ağacını sıralanmış alan anahtarlarıyla bir dizeye dönüştürmem gerekiyor. Bunun tam olarak nasıl yapılacağı tamamen açık değil - özellikle de bu kadar basit - JsonNode jn = ObjectMapper.readTree(String s).Jackson JsonNode, sıralanmış anahtarlarla dizeye

Doğru yöntem void writeTree(JsonGenerator jgen,JsonNode rootNode) şeklindedir. Ancak, JsonGenerator numaralı seriden String seri numarasını almanın bir yolunu göremiyorum. JsonGenerator.Feature'un bu seçeneğe sahip olmaması nedeniyle SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS'un hala geçerli olacağını farz ediyorum. Bunu yapmak için daha basit bir yol var mı yoksa yoksa, JsonGenerator'dan seri hale getirilmiş dizgiyi nasıl alabilirim?

cevap

27

Jackson'un yazarlarından biri tarafından sağlanan, bunu yapmanın en kolay yolu budur. Şu anda JsonNode'dan String'a sıralanmış tuşlarla doğrudan gitmenin hiçbir yolu yoktur.

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 içinde dizileri sıralamanın bir yolu var mı? Eğer json diziniz varsa bu çözüm işe yaramaz: '{id: 1, toplama: [z, y]}', eğer tahsilattan sonra '' tahsilat '' (koleksiyon: [z, y], id: 1} 'ise, * koleksiyondaki öğeler * hiç sipariş vermedi! :( – Cherry

+1

@Cherry Diziyi normal olarak serileştirmeden önce sırala: Jackson'ın haritaları sıralayabilmesi için ihtiyacı olan şey, haritaların doğası gereği olan bir sıralamaya sahip olmamaları, böylece dizilerin JSON'a serileştirilmeden önce dizileri sıraya dizilebilmesidir. haritalar için (genel olarak) mümkün değildir. – elhefe