Just murmur

Jackson 序列化後的 JSON 出現重複的屬性

接續之前的文章,發現 Polymorphic 物件序列化後,用來判斷物件類別的屬性被重複輸出了兩次。

根據這篇文章的說法,Jackson 在續列化時會根據 @JsonSubTypes.Type 的值先輸出 action 屬性,接著才把物件內容序列化。碰巧該物件也有一個 action 屬性,所以被輸出了兩次。會發生這樣的問題是因為 action 被同時用來判斷物件類別以及其他用途。

要解決很簡單,同一篇文章就有答案了。把 @JsonTypeInfo 裡的 JsonTypeInfo.As.PROPERTY 改成 JsonTypeInfo.As.EXISTING_PROPERTY 即可。如下

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true, property = "action")
@JsonSubTypes({
    @Type(value = SendMessageAction.class, name = "sendMessage"),
    @Type(value = LoginAction.class, name = "login")
})
abstract class Action {
    protected String action;

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }
}