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

我确实尝试使用以下注释并且它有效,即使使用属性标签也是如此。

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

将“name”属性添加到@Type 的子类型,并为@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 回答