2011-01-01 5 views
2
children: [ 
     { 
      o kind: "t3" 
      data: {     // ExampleNodeT3 class should be used for kind == t3 
       + t3var1: "val1" 
       + t3var2: true 
      } 
     } 
     { 
      o kind: "t4"     
      data: {     // ExampleNodeT4 class should be used for kind == t4 
       + t4var1: false 
       + t4var2: 2346 
      } 
     } 
] ... etc. 


@JsonTypeInfo(use=Id.NAME, property="kind") 
@JsonSubTypes({ 
@Type(value=ExampleNodeT3.class, name="t3"), 
@Type(value=ExampleNodeT4.class, name="t4")}) 
public abstract class ExampleNode { 
... 
public void setData(ExampleNode data) { 
    this.data = data; 
} 

これをJacksonでデシリアライズしようとすると、kindNodeデータが作成されたときにJsonTypeInfoヒントが失敗します。これは、「kind」プロパティがその親に関連付けられ、表示されないためです。私はさまざまなバリエーションのファクトリメソッドやJacksonアノテーションを試しましたが、JacksonがExampleNodeオブジェクトを作成してsetData()自体に渡すため、作成するオブジェクトのクラスを制御する場所がありません。デシリアライズ時にサブクラスを決定するために親オブジェクトのプロパティを使用しますか?

+0

どうやら、この機能はできません。機能の拡張がここで要求されました:http://jira.codehaus.org/browse/JACKSON-275 – phreakocious

+0

そして、この問題の詳細はここにあります:http://jackson-users.ning.com/forum/topics/how- commentId = 5286555%3AComment%3A2679 – phreakocious

答えて

1

修正 - 「外部タイプ識別子」の(逆シリアル化オブジェクト内に含まれていないものが、兄弟など)の使用でありますまだサポートされていません。

このようなタイプの識別子を使用する能力を直接要求するための新しい機能要求を提出することができる、前述のJiraの問題を超えて実装することができます。これは実際には複数のユーザーによって言及されています。おそらくそのような型付け構造を使用するデータ形式(geoJSON?)があるからです。

+0

ここでリクエストしています:http://jira.codehaus.org/browse/JACKSON-453 – phreakocious

2

ここからGoogleにアクセスし、解決策を見つけました。実際には、これらの日にその可能性に起因含ま= JsonTypeInfo.As.EXTERNAL_PROPERTY、例に:

public class Parent { 

    @JsonProperty("type") 
    public String type; 

    @JsonProperty("data") 
    @JsonInclude(Include.NON_NULL) 
    public ChildBase ChildBase; 

    public Parent() { 
     medias = new HashMap<>(); 
    } 

    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.EXTERNAL_PROPERTY, property="type") 
    @JsonTypeIdResolver(ChildBaseByParentTypeResolver.class) 
    public void setChildBase(ChildBase ChildBase){ 
     this.ChildBase = ChildBase; 
    } 
} 


@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ChildBase { 
     public String someStr; 

} 


@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class AggressiveChild extends ChildBase{ 
    public String someStr1; 

} 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ChilledChild extends ChildBase{ 
    public String someStr1; 

} 


public class ChildBaseByParentTypeResolver extends TypeIdResolverBase { 

    private JavaType superType; 

    @Override 
    public void init(JavaType baseType) { 
     superType = baseType; 
    } 

    @Override 
    public Id getMechanism() { 
     return Id.NAME; 
    } 

    @Override 
    public JavaType typeFromId(DatabindContext context, String id) { 
     Class<?> subType = ChildBase.class;  
     switch (id) { 
     case "agressiveParent":   
      subType = AggressiveChild.class; 
      break; 
     case "chilledParent":   
      subType = ChilledChild.class; 
      break;   
     } 
     return context.constructSpecializedType(superType, subType);   
    } 

    @Override 
    public JavaType typeFromId(String directiveType) { 
     throw new NotImplementedException(); 
    } 

} 

興味深い記事:

Polymorphism with jackson friend

Related stack overflow question