2016-08-02 54 views
1

我有基类BaseItem像杰克逊默认的序列

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

然后我有一个像

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

DerivedItem类如何使DerivedItem使用默认杰克逊串行?如果那是不可能的,那么我怎样才能使自定义序列化程序作为默认的序列化程序?

回答

1

请尝试以下

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

这应该告知杰克逊使用自定义序列的基础项目,但不是DerivedItem。

编辑:证据是在布丁

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

太谢谢你了! –