2017-08-03 2 views
0

Ich verwende JsonTypeInfo, um Polymorphismus auf einigen JSON-Objekten zu verarbeiten, die mein System einliest. Das System stellt diese Objekte auch anderen Diensten zur Verfügung. In einigen Fällen möchte ich detaillierte Objekte einschließlich Typ Info und in anderen Fällen möchte ich Barebones minimale Ansichten der Objekte.Jackson JsonView und JSonTypeInfo

Ich versuche, JsonViews einzurichten, um damit umzugehen, aber egal was ich tue, es enthält die Typinformation in dem serialisierten JSON. Ich habe eine Handvoll unterschiedlicher Wege ausprobiert, aber unten ist ein Beispiel dafür, was ich zu tun versuche.

@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; 
} 

Antwort

1

Es stellte sich heraus, dass ich die Typen definieren versagt, wenn ich zuvor unter Verwendung von JsonTypeInfo.As.EXISTING_PROPERTY versucht. Es wurde zurückgeschaltet und auch der Typ in jeder Kindklasse definiert.

@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"; } 
} 
Verwandte Themen