2013-09-23 9 views
17

Używam Jackson 2.2.3 i potrzebuję przekonwertować drzewo JsonNode na ciąg z posortowanymi klawiszami pola. Nie mam pojęcia, jak to zrobić, zwłaszcza, że ​​przeciwieństwo jest tak proste - JsonNode jn = ObjectMapper.readTree(String s).Jackson JsonNode na ciąg z posortowanymi kluczami

Wygląda na to, że właściwą metodą jest void writeTree(JsonGenerator jgen,JsonNode rootNode). Jednak nie widzę sposobu, aby następnie uzyskać numer seryjny String od JsonGenerator. Zakładam, że nadal będzie obowiązywać SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, ponieważ JsonGenerator.Feature s nie ma tej opcji. Czy istnieje prostszy sposób, aby to zrobić - lub jeśli nie, w jaki sposób pobrać ciąg serializowany z JsonGenerator?

Odpowiedz

27

To jest najłatwiejszy sposób, jak zapewnia jeden z autorów Jacksona. Obecnie nie ma sposobu, aby przejść bezpośrednio z JsonNode do String z posortowanymi klawiszami.

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

Czy istnieje sposób sortowania tablic wewnątrz JSON? To rozwiązanie nie działa, jeśli masz tablicę json: '{id: 1, kolekcja: [z, y]}' po seiralizacji, jeśli jest to bacame '{kolekcja: [z, y], id: 1}' dzięki czemu elementy w kolekcji * * Nie zamówiłem wcale! :( – Cherry

+1

@Cherry Po prostu posortuj tablicę przed serializacją, dlatego Jackson potrzebuje możliwości sortowania map, ponieważ mapy nie mają nieodłącznego uporządkowania.Aparaty robią, więc aplikacja może zamówić tablice zgodnie z oczekiwaniami przed serializowaniem do JSON. nie jest możliwe (ogólnie) dla map. – elhefe

Powiązane problemy