Jackson JsonView和JSonTypeInfo

时间:2017-08-03 20:59:25

标签: java json annotations jackson polymorphism

我正在使用JsonTypeInfo来处理我的系统读入的一些JSON对象的多态性。系统还将这些对象提供给其他服务。在某些情况下,我想要详细的对象,包括类型信息,在其他情况下,我想要准确的对象的简单视图。

我正在尝试设置JsonViews来处理这个问题,但无论我做什么,它都包含序列化JSON中的类型信息。我尝试了一些不同的方法,但下面是我想要做的一个例子。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = PlayerSpawnedEvent.class, name = "PlayerSpawnedEvent"),
        @JsonSubTypes.Type(value = PlayerStateChangedEvent.class, name = "EntityStateChangeEvent")
})

public abstract class AbstractEvent
{
    @JsonView(Views.Detailed.class)
    public String type;

    @JsonView(Views.Detailed.class)
    public String id;

    @JsonView(Views.Minimal.class)
    public long time;
}

1 个答案:

答案 0 :(得分:1)

事实证明,当我之前尝试使用JsonTypeInfo.As.EXISTING_PROPERTY时,我无法定义类型。解决了它并在每个子类中定义了类型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = PlayerSpawnedEvent.class, name = "PlayerSpawnedEvent"),
        @JsonSubTypes.Type(value = PlayerStateChangedEvent.class, name = "PlayerStateChangedEvent")
})

public abstract class AbstractEvent
{
    @JsonView(Views.Detailed.class)
    public String type;

    @JsonView(Views.Detailed.class)
    public String id;

    @JsonView(Views.Minimal.class)
    public long time;
}

public class PlayerSpawnedEvent
{
    public PlayerSpawnedEvent() { type = "PlayerSpawnedEvent"; }
}

public class PlayerStateChangedEvent
{
    public PlayerStateChangedEvent() { type = "PlayerStateChangedEvent"; }
}