2017-10-27 1 views
1

Ich bin mit Jackson diese Datenstruktur, um zu versuchen und deserialisieren:Deserialisieren Unterobjekt mit Typ-ID in Top-Level-Objekt

{ 
    "type": "foo",  // or "bar", "baz", etc 
    "name": "number 1", 
    "params": { 
    // parameters specific to type 'foo' 
    } 
} 

Ich weiß, dass ich einen benutzerdefinierten Deserializer verwenden könnte, aber ich frage mich, ob Dies ist nur mit der @JsonType* Annotationsfamilie möglich?

Im Moment habe ich meine Klassen in etwa so ein:

public class TopLevelObject { 
    String type; 
    String name; 
    AbstractParams params; 
} 

public class FooParams extends AbstractParams { 
    String one; 
    String two; 
} 

public class BarParams extends AbstractParams { 
    String three; 
    String four; 
} 

abstract public class AbstractParams { 
} 

I @JsonTypeInfo auf der type Eigenschaft verwenden kann, wenn ich die Eigenschaft in die AbstractParams Klasse bewegen, aber ich kann nicht scheinen, um Das gleiche Ergebnis, während die type Eigenschaft in der TopLevelObject gehalten wird.

Irgendwelche Ideen?

Antwort

1

Kann @JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY) verwenden. Aber As.EXTERNAL_PROPERTY kann nur für Eigenschaften verwendet werden. More info.

So Sie @JsonTypeInfo Anmerkung auf dem AbstractParams Feld/Setter der TopLevelObject Klasse

class TopLevelObject { 
    public String type; 
    public String name; 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
      include= JsonTypeInfo.As.EXTERNAL_PROPERTY, 
      property = "type") 
    @JsonSubTypes({ 
      @JsonSubTypes.Type(value = FooParams.class, name = "foo"), 
      @JsonSubTypes.Type(value = BarParams.class, name = "bar")}) 
    public AbstractParams params; 

} 
+0

Perfekt zu setzen haben, das ist genau das, was ich gesucht habe! Vielen Dank! –