1

以下をシリアライズ/デシリアライズしようとしています

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = IdBundleCombine.class), 
    @JsonSubTypes.Type(value = IdBundleDistinct.class) })
public abstract class IdBundle
{
    String sharedId;
    Long   internalId;
    //getters
}

public class IdBundleCombine extends IdBundle
{
    //setters
}

public class IdBundleDistinct extends IdBundle
{
    //setters
}

次のコードで

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("foo.json"), someInstanceOfIdBundle);

以下を生成します(ご覧のとおり、型情報はありません):

{"sharedId":"foobar","internalId":1234}

missing property '@type' that is to contain type idそのため、デシリアライズしようとするとエラーが発生します。

のパラメーターのすべての組み合わせを試し ましたが、ファイルに表示する型情報を取得することに成功することは@JsonTypeInfoあり@JsonSubTypesませんでした。@JsonTypeNameまた、結果なしで subType で再生しようとしました。

私の唯一の推測は、マッパーで何か間違ったことをしているということですが、ほとんどの人はタイプ情報がjson文字列に表示されることを望まないか、逆シリアル化プロセスの問題。

4

2 に答える 2

0

サブタイプの @Type に 'name' 属性を追加し、 @JsonTypeInfo の 'property' 属性に任意の値を指定します。下のクラス

<!-- language: java -->
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "meta-type")
@JsonSubTypes({@Type(value = IdBundleCombine.class, name = "bundle-combine"),
    @Type(value = IdBundleDistinct.class, name = "bundle-distinct")})
public abstract class IdBundle{
}

IdBundleCombine の場合、次の json が生成されます {"meta-type": "bundle-combine", "sharedId":"foobar","internalId":1234}

于 2015-12-02T17:17:22.323 に答える
0

次の注釈を使用してみましたが、プロパティ タグを使用しても機能しました。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "@type")
于 2015-02-06T11:08:12.307 に答える