2012-02-28 13 views
9

Estoy tratando de reemplazar una serialización personalizada JSON (de) en un proyecto groovy/grails con Jackson.Serialized JSON con claves clasificadas, usando Jackson

Tengo problemas para lograr que Jackson emita un JSON bastante impreso con claves ordenadas en un simple orden alfabético "natural". He intentado esto (y muchas variaciones):

mymap = [ ... ] // Some groovy map 
def mapper = new ObjectMapper() 
mapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true) 
def jsonstring = mapper.defaultPrettyPrintingWriter().writeValueAsString(mymap) 

Pero Jackson genera tenazmente un JSON donde las claves parecen estar en un orden aleatorio. He intentado cambiar el tipo de 'mymap' con un TreeMap, y en ese caso todas las claves están correctamente ordenadas como se esperaba.

Me pregunto si hay una manera de obtener las claves ordenadas sin cambiando 'mymap' de arriba a un TreeMap (y recursivamente todos los valores de su mapa ...).

SORT_PROPERTIES_ALPHABETICALLY parece estar destinado a hacer precisamente eso, pero no lo hace por alguna razón. ¿Sabrías por qué es así? ¿Algo que estoy haciendo mal arriba?

He intentado con Jackson 1.8.3, 1.8.8 y 1.9.5, mismo resultado (claves aleatorias).

Respuesta

4

El documentation de SORT_PROPERTIES_ALPHABETICALLY dice explícitamente:

característica que define el fin de serialización propiedad predeterminada utilizada para los campos POJO (nota: hace no aplican a Mapa de serialización)

así que supongo tendrá que cambiar su mapa de entrada (como usted dice)

+0

Buen punto, me perdí. Parece que debo olvidar la agradable y elegante forma de establecer una preferencia de serialización. –

+1

Debería poder hacer: 'def jsonstring = mapper.defaultPrettyPrintingWriter(). WriteValueAsString (mymap as TreeMap)' ¿no? –

+0

No, eso no ayuda. La implementación de 'mymap' no es TreeMap. E incluso si lo fuera, tendría que asegurarme de que todos los demás valores de mapa en 'mymap' también sean TreeMap, y ahí es donde se vuelve muy complicado. –

1

Como se señaló, esta función solo funciona para POJO. Sin embargo, creo que hay una solicitud de función para hacer lo mismo con Maps, al Jackson Jira; y si no, esto parece una buena adición.

Pero mientras tanto, recomendaría en segundo lugar a @tim_yates utilizar TreeMap intermedio para ordenar, serializando eso: ordenar que Map tenga se utilizará tal cual, entonces esto debería funcionar.

13

Según lo indicado por @tim_yates, esto no funciona con las teclas del mapa.

Usted podría utilizar

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

Para mí' JSON_MAPPER.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) 'funciona muy bien y esta respuesta fue muy útil :) –

+0

¡Es bueno escuchar! :-) Puede ahorrar mucho tiempo ;-) – bknopper

+2

¡Gracias! En v2.6.1 parece haber sido movido a un paquete diferente. Esto funcionó para mí: 'mapper.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);' – Tom

Cuestiones relacionadas