2013-09-23 8 views
17

Sto usando Jackson 2.2.3 e ho bisogno di convertire un albero JsonNode in una stringa con le chiavi di campo ordinate. Non mi è chiaro come farlo, soprattutto perché il contrario è così semplice: JsonNode jn = ObjectMapper.readTree(String s).Jackson JsonNode alla stringa con chiavi ordinate

Sembra che il metodo corretto sia void writeTree(JsonGenerator jgen,JsonNode rootNode). Tuttavia, non vedo il modo di ottenere il numero di serie String da JsonGenerator. Presumo che lo SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS sarà ancora valido, dal momento che gli JsonGenerator.Feature s non hanno questa opzione. C'è un modo più semplice per farlo - o in caso contrario, come faccio a recuperare la stringa serializzata dal JsonGenerator?

risposta

27

Questo è il modo più semplice per farlo, come previsto da uno degli autori di Jackson. Al momento non è possibile passare direttamente da JsonNode a String con chiavi ordinate.

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

C'è un modo per ordinare gli array anche all'interno di JSON? Questa soluzione non funziona se si dispone dell'array json: '{id: 1, collezione: [z, y]}' dopo la seiralizzazione se bacame '{collezione: [z, y], id: 1}' quindi articoli in * raccolta * non ha ordinato affatto! :( – Cherry

+1

@Cherry Ordinate semplicemente la matrice normalmente prima della serializzazione, il motivo per cui Jackson ha bisogno di ordinare le mappe è perché le mappe non hanno ordinamento intrinseco. Gli array fanno, e quindi l'applicazione può ordinare gli array come desiderato prima di serializzare su JSON. non è possibile (in generale) per le mappe. – elhefe

Problemi correlati