我正在使用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;
}

最佳答案

原来,当我尝试使用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"; }
}

关于java - jackson JsonView和JSonTypeInfo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45494420/

10-10 09:02