2016-08-02 3 views
1

は私がジャクソン・デフォルト・シリアライザ

@JsonSerialize(using = MyCustomSerializer.class) 
class BaseItem { 
    ... 
} 

のように、基本クラスBaseItemを持って、私はDerivedItemがデフォルトジャクソン・シリアライザを使用できるようにする方法

@JsonSerialize(using = ???.class) 
class DerivedItem extends BaseItem { 
    ... 
} 

ようDerivedItemクラスがありますか?それが不可能な場合、どのように私はデフォルトのものとして動作するカスタムシリアライザを作ることができますか?

答えて

1

これは基本アイテムのためではなく、DerivedItemのためのカスタム・シリアライザを使用するためにジャクソンに通知する必要があり、次の

@JsonSerialize(using = JsonSerializer.None.class) 
class DerivedItem extends BaseItem { 
    ... 
} 

を試してみてください。

編集:証拠はプディングである

BaseItem.java

@JsonSerialize(using = BaseSerializer.class) 
    public class BaseItem { 
    public BaseItem(int x) { 
     this.x = x; 
    } 
    public int getX() { 
     return x; 
    } 
    public void setX(int x) { 
     this.x = x; 
    } 

    int x; 
    } 

DerivedItem.java

@JsonSerialize(using = JsonSerializer.None.class) 
    public class DerivedItem extends BaseItem { 
    public DerivedItem(int x, int y) { 
     super(x); 
     this.y = y; 
    } 

    public int getY() { 
     return y; 
    } 
    public void setY(int y) { 
     this.y = y; 
    } 

    int y; 
    } 

それならば表すブール値に数値を変換する愚かなカスタム・シリアライザ正の数。

public class BaseSerializer extends JsonSerializer<BaseItem> { 
    @Override 
    public void serialize(BaseItem value, 
          JsonGenerator jgen, 
          SerializerProvider provider) throws IOException { 
     jgen.writeStartObject(); 
     jgen.writeBooleanField("x", value.getX() > 0); 
     jgen.writeEndObject(); 
    } 
    } 

出力

public static void main(String[] args) { 
    ObjectMapper mapper = new ObjectMapper(); 
    BaseItem baseItem = new BaseItem(1); 
    DerivedItem derivedItem = new DerivedItem(1,2); 
    System.out.println("Base Item: " + mapper.writeValueAsString(baseItem)); 
    System.out.println("Derived Item: " + mapper.writeValueAsString(derivedItem)); 
    } 

それを試してみることができます:

Base Item:{"x":true} 
Derived Item:{"x":1,"y":2} 
+0

ありがとうございました! –

関連する問題