2016-07-08 13 views
0

Ich bin neu in der Verwendung von Jackson & Deserialisierung von JSON. I "m versuchen, einen Nachrichtenprozessor zu schaffen und haben so etwas wie die folgende:Verwenden Jackson JSON Deserialize mit w/geschachtelte Klasse?

@JsonDeserialize(builder = TestMessage.TestMessageBuilder.class) 
private static class TestMessage { 
    @Nonnull 
    private Long timestamp; 
    @Nonnull 
    private String regionId; 
    @Nonnull 
    private String userId; 
    @Nonnull 
    private String action; 
    @Nonnull 
    private TestMessageMetadata metadata; 

    @JsonPOJOBuilder(withPrefix = "") 
    public static class TestMessageBuilder {} 
} 

Das Problem ist, dass je nachdem, welche Art von Aktionstyp die Nachricht kommt mit der TestMessageMetadata muß eine von sein eine Reihe von verschiedenen Unterklassen Wenn die Aktion beispielsweise "stream" ist, muss TestMessageMetadata vom Typ TestMessageStreamMetadata sein Jede Unterklasse von TestMessageMetadata hat unterschiedliche Attribute (TestMessageStreamMetadata kann 4 Felder haben, die nur für den "stream" -Typ gelten) Nachrichten, während für einige andere Aktionen möglicherweise nur 1 Feld vorhanden ist, das nur für diese Art von Aktion usw. gilt.)

Der Prozessor muss nur diese eine übergeordnete Nachrichtenklasse haben. Welche Möglichkeiten gibt es also, um die verschiedenen Aktionstypen zu behandeln? Hilfe würde sehr geschätzt werden!

Antwort

1

Das Problem ist, dass je nachdem, welche Art von Aktionstyp der Meldung kam mit der TestMessageMetadata wird ein aus einer Reihe von ein paar verschiedenen Unterklassen sein muß.

Scheint, dass Sie nach @JsonTypeInfo suchen. @JsonTypeInfo wird verwendet, um polymorphe Typen zu behandeln. Es konfiguriert Fälle, in denen der tatsächliche Typ eines Eigenschaftswerts einer von mehreren Untertypen sein kann.

Es folgt ein Beispiel:

class TestMessage { 

    private String action; 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_POPERTY, propery = "action") 
    @JsonSubTypes({ 
     @JsonSubTypes.Type(value = TestMessageStreamMetadata.class, name = "stream"), 
     @JsonSubTypes.Type(value = TestMessageFooMetadata.class, name = "foo") 
    }) 
    private TestMessageMetadata metadata; 

} 
Verwandte Themen