親オブジェクトのプロパティを使用して、脱必要なときにサブクラスを決定しますか?

StackOverflow https://stackoverflow.com/questions/4574952

質問

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でこれを脱必要にしようとすると、JsonTypeinfoのヒントは、「親切」プロパティが親に関連付けられていて、見えないため、ExamPlenodeデータが作成されると失敗します。私は工場の方法とジャクソンのアノテーションのさまざまなバリエーションを試しましたが、ジャクソンはExamplenodeオブジェクトを作成し、それをSetData()自体に渡すため、どのクラスのオブジェクトが作成されるかを制御する場所はありません。

役に立ちましたか?

解決 2

この機能はまだサポートされていません。

機能拡張リクエスト: http://jira.codehaus.org/browse/jackson-275

問題の詳細: http://jackson-users.ning.com/forum/topics/how-to-use-a-poperty-of?commentid=5286555%3Acomment%3A2679

他のヒント

Googleからここに着き、解決策を見つけました。実際、最近では、include = 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();
    }

}

興味深い記事:

ジャクソンの友人との多型

関連するスタックオーバーフローの質問

正しい - 「外部タイプ識別子」(脱必要とするオブジェクト内に含まれていないが、兄弟として)の使用はまだサポートされていません。

これは実装できます(サポートが追加されることを防ぐ根本的なものは何もありません) - 言及されたJiraの問題を超えて、そのようなタイプ識別子を使用する能力を直接要求するために新しい機能要求を提出することができます。これは実際に複数のユーザーによって言及されています。おそらく、そのようなタイピング構造を使用するデータ形式(Geojson?)があるからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top