2012-06-14 13 views
16

私はItemクラスを持っています。そのクラスの内部には、ItemType型のフィールドがあります(itemType)。ジャクソンにオブジェクトの代わりにフィールドのシリアル化を指示する方法

おおよそ、このようなものです。

class Item 
{ 
    int id; 
    ItemType itemType; 
} 

class ItemType 
{ 
    String name; 
    int somethingElse; 
} 

私はジャクソンObjectMapperを使用してタイプItemのオブジェクトをシリアル化しています、それはサブオブジェクトとしてItemTypeをシリアル化します。期待されているが、私が望むものではない。私がやりたい何

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

は連載時に代わりにitemTypenameフィールドを表示することです。

次のようなものです。

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

とにかくジャクソンに指示することはありますか?

答えて

14

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

ありがとうございました!これは完全に機能しました! :) –

+0

これは動作します。完全性のために、関連する可能性は 'ItemType'に' JsonSerializable'(メソッド "serialize()"を実装させることです)。 – StaxMan

+0

なぜ内部クラスとしてシリアライザを宣言できないのかわかりませんが、それは私にエラーを与え続けます。 –

1

おそらく、迅速な問題を回避するには、ItemType.nameを返すためにItemに余分なゲッターを追加し、@JsonIgnoreItemTypeゲッターをマークするのですか?

15

@JsonValue注釈を確認してください。このような:

EDITはOPが一つだけのフィールドをシリアル化したいと考えていたよう

class ItemType 
{ 
    @JsonValue 
    public String name; 

    public int somethingElse; 
} 
+3

これが私の問題をどのように解決するかを説明するのに気をつけますか? :) –

+1

質問は、 "それは自己ではなくオブジェクト内のフィールドをシリアル化するようにジャクソンに指示する方法でしたか?"それは '@ JsonValue'でそのフィールドに注釈を付けることによって行われます。 – StaxMan

+1

pingw33nの答えが実際のところ私の状況を助けてくれましたが、元の質問に対する最良の答えです。 – Kirby

2

、あなたも@JsonIdentityInfo@JsonIdentityReference注釈を使用することができます。

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

詳細情報については、How to serialize only the ID of a child with Jacksonを参照してください。

+0

私はこれが受け入れられた答えであるべきだと思います。はるかに簡単でOPの問題をよりエレガントに解決します。 –

関連する問題