2012-06-14 11 views
16

Ich habe eine Item Klasse. Innerhalb dieser Klasse gibt es ein itemType Feld vom Typ ItemType.Wie man Jackson anweist, ein Feld in einem Objekt statt des Objekts selbst zu serialisieren?

grob, so etwas wie das.

class Item 
{ 
    int id; 
    ItemType itemType; 
} 

class ItemType 
{ 
    String name; 
    int somethingElse; 
} 

Wenn ich ein Objekt vom Typ Item mit Jackson ObjectMapper am Serialisierung serialisiert es das Objekt ItemType als Unterobjekt. Was erwartet wird, aber nicht was ich will.

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

Was würde ich tun möchte, ist die itemType ‚s name Feld statt zu zeigen, wenn serialisiert.

Etwas wie unten.

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

Gibt es trotzdem eine Anweisung an Jackson, dies zu tun?

Antwort

14

Sie müssen eine custom serializer erstellen und verwenden.

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

Vielen Dank! Das hat perfekt funktioniert! :) –

+0

Das funktioniert. Und aus Gründen der Vollständigkeit besteht eine verwandte Möglichkeit darin, "ItemType" zu implementieren "JsonSerializable" (Methode "serialize()"). – StaxMan

+0

Ich weiß nicht, warum ich den Serializer nicht als innere Klasse deklarieren kann, es gibt mir einen Fehler. –

1

Vielleicht eine schnelle Abhilfe ist, einen zusätzlichen Getter auf Item hinzufügen ItemType.name, zurückzukehren und ItemType Getter mit @JsonIgnore markieren?

15

Auschecken @JsonValue Annotation.

EDIT: wie folgt aus:

class ItemType 
{ 
    @JsonValue 
    public String name; 

    public int somethingElse; 
} 
+3

Möchten Sie erklären, wie dies mein Problem lösen würde? :) –

+1

Frage war "wie man Jackson anweist, ein Feld innerhalb eines Gegenstandes anstatt des Gegenstandes es selbst zu serialisieren?" und das geschieht durch Annotation des Feldes mit @ JsonValue. – StaxMan

+1

Dies ist die beste Antwort auf die ursprüngliche Frage, obwohl pingw33n's Antwort tatsächlich meiner Situation hilft, die etwas anders als die ursprüngliche Frage war. – Kirby

2

Als OP nur ein Feld serialisiert werden will, könnte man auch die @JsonIdentityInfo und @JsonIdentityReference Anmerkungen verwenden:

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

Weitere Informationen finden Sie How to serialize only the ID of a child with Jackson.

+0

Ich denke, das sollte die akzeptierte Antwort sein. Es ist viel einfacher und löst das Problem des OPs eleganter. –

Verwandte Themen