2012-06-14 21 views
16

Tengo una clase Item. Hay un campo itemType dentro de esa clase que es del tipo ItemType.¿Cómo se instruye a Jackson para serializar un campo dentro de un Objeto en lugar del Objeto mismo?

aproximadamente, algo como esto.

class Item 
{ 
    int id; 
    ItemType itemType; 
} 

class ItemType 
{ 
    String name; 
    int somethingElse; 
} 

Cuando estoy serializar un objeto de tipo Item usando Jackson ObjectMapper, serializa el objeto ItemType como un sub-objeto. Lo que se espera, pero no es lo que quiero.

{ 
    "id": 4, 
    "itemType": { 
    "name": "Coupon", 
    "somethingElse": 1 
    } 
} 

Lo que me gustaría hacer es mostrar name campo de la itemType 's lugar cuando serializado.

Algo como a continuación.

{ 
    "id": 4, 
    "itemType": "Coupon" 
} 

¿Hay alguna forma de instruir a Jackson para hacerlo?

Respuesta

14

Necesita crear y usar un custom serializer.

public class ItemTypeSerializer extends JsonSerializer<ItemType> 
{ 
    @Override 
    public void serialize(ItemType value, JsonGenerator jgen, 
        SerializerProvider provider) 
        throws IOException, JsonProcessingException 
    { 
     jgen.writeString(value.name); 
    } 

} 

@JsonSerialize(using = ItemTypeSerializer.class) 
class ItemType 
{ 
    String name; 
    int somethingElse; 
} 
+2

¡Gracias! Esto funcionó a la perfección! :) –

+0

Esto funciona. Y para completar, una posibilidad relacionada es hacer que 'ItemType' implemente' JsonSerializable' (método "serialize()"). – StaxMan

+0

No sé por qué no puedo declarar el serializador como una clase interna, me sigue dando un error. –

1

Tal vez una solución rápida es añadir un captador adicional en Item para volver ItemType.name, y marcar ItemType captador con @JsonIgnore?

15

Echa un vistazo a @JsonValue anotación.

EDIT: de esta manera:

class ItemType 
{ 
    @JsonValue 
    public String name; 

    public int somethingElse; 
} 
+3

¿Me explico cómo esto solucionaría mi problema? :) –

+1

La pregunta fue "¿Cómo se instruye a Jackson para serializar un campo dentro de un Objeto en lugar del Objeto mismo?" y eso se hace anotando dicho campo con '@ JsonValue'. – StaxMan

+1

Esta es la mejor respuesta a la pregunta original, aunque la respuesta de pingw33n en realidad ayuda a mi situación que era ligeramente diferente a la pregunta original aquí – Kirby

2

Como OP sólo quiere serializar un campo, se podría también utilizar los @JsonIdentityInfo y @JsonIdentityReference anotaciones:

class Item { 
    int id; 
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="name") 
    @JsonIdentityReference(alwaysAsId=true) 
    ItemType itemType; 
} 

Para obtener más información, consulte How to serialize only the ID of a child with Jackson.

+0

Creo que esta debería ser la respuesta aceptada. Es mucho más simple y resuelve el problema del OP de forma más elegante. –

Cuestiones relacionadas