杰克逊:丢失类型信息

时间:2013-10-30 11:18:16

标签: java json serialization jackson

我正在尝试序列化/反序列化以下

@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而没有结果。

我唯一的猜测是我在使用映射器时出错了,但由于大多数人似乎不希望类型信息显示在json字符串中,所以我找不到任何关于该主题的内容,或者在反序列化过程中遇到问题。

2 个答案:

答案 0 :(得分:0)

我确实尝试使用以下注释,即使使用属性标记,它也能正常工作。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "@type")

答案 1 :(得分:0)

添加'名称'属性为@Type的子类型,并给出属性' @JsonTypeInfo的属性您选择的任何值。下面的课程

<!-- 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}