2012-04-20 21 views
6

Creo que Jackson hace la serialización basada en el método, ¿hay alguna manera en que pueda hacerlo basado en el campo?serialización basada en el campo de Jackson

Ex:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

La salida JSON tiene "i" y "SETI". ¿Hay alguna manera de que pueda anular esto para obtener solo "yo"? También sería genial si hubiera una manera de hacerlo sin agregar anotaciones a la clase (se generan automáticamente).

+1

Este código no se compila. ¿Puedes publicar el código real que estás utilizando y cómo estás intentando serializar? –

Respuesta

5

Para lograr esto sin anotaciones puede configurar el ObjectMapper antes de serializar/deserializar de la siguiente manera:

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

Jackson también puede utilizar los campos, sí; pero de forma predeterminada solo se descubren los campos públicos. Pero puede usar @JsonProperty para marcar campos no públicos.

Una cosa a tener en cuenta es que si hay un método (setX, getX) y un campo (x), el método tendrá prioridad. Esto no suele ser un problema, pero si lo es, debe desactivar explícitamente los métodos que no se van a usar, agregando @JsonIgnore enxt a ellos.

10

Echa un vistazo a la anotación @JsonAutoDetect. Ejemplo:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

La respuesta aceptada no produjo el resultado esperado para mí. Lo que funciona para mí, sin añadir anotaciones es configurar el ObjectMapper de la siguiente manera:

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

Ésta es la forma en que parece que tiene más sentido para mí, que utiliza los campos en lugar de captadores \ set como serialización estándar de Java haría hacer.

Cuestiones relacionadas