2012-06-19 12 views
8

¿Cómo puedo serializar una propiedad que es un mapa como una lista de los valores del mapa? He podido hacer otras conversiones simples usando la anotación @JsonSerialize(using=...) en el getter. Sin embargo, no estoy seguro si existe uno para lo que quiero hacer.Cómo serializar un mapa como lista usando Jackson

Respuesta

7

necesitábamos algo similar, en nuestro caso se utilizó un personalizado @JsonSerialize como te comento, y que era estúpido simple:

public class MyCustomSerializer extends JsonSerializer<Map<?, ?>> { 
    @Override 
    public void serialize(final Map<?, ?> value, final JsonGenerator jgen, final SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeObject(value.values()); 
    } 
} 

Código de usarlo:

import java.io.IOException; 
import java.util.Collections; 
import java.util.Map; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.JsonSerializer; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializerProvider; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

public class JacksonTest { 

    public static class ModelClass { 
     private final Map<String, String> map; 

     public ModelClass(final Map<String, String> map) { 
      super(); 
      this.map = map; 
     } 

     @JsonSerialize(using = MyCustomSerializer.class) 
     public Map<String, String> getMap() { 
      return map; 
     } 

    } 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.writeValue(System.out, new ModelClass(Collections.singletonMap("test", "test"))); 
    } 

} 
3

que implementa utilizando por defecto Serializador para manejar valores que no son solo String:

@Override 
public void serialize(final Map<Long, ?> value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, 
      JsonProcessingException { 
    provider.defaultSerializeValue(value.values(), jgen); 
} 

EDITAR: Como mencionó Radu Simionescu, esta solución solo funciona para Maps of Pojos.

+0

sí, lo hizo, y podría haber funcionado en su caso, pero no funciona con mapas y colecciones, pero solo con pojos. no hay provider.defaultSerializeMap desafortunadamente –

Cuestiones relacionadas