我正在尝试序列化/反序列化以下
@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字符串中,所以我找不到任何关于该主题的内容,或者在反序列化过程中遇到问题。
答案 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}