java - 通过字段进行杰克逊多态反序列化
问题描述
比方说,我有一堂课
public class A{
private UUID typeId;
private B data;
}
public abstract class B{
private String a;
}
public class BChildOne extends B{
... some variables
}
public class BChildTwo extends B{
... some variables
}
B 类的类型在变化,根据 A 的 typeId ,所以如果 A 的 typeId 为“XXX”,则数据字段的类型为 BChildOne,如果 A 的 typeId 为“YYY”,则数据字段的类型为 BChildTwo。
我怎样才能做到这一点?
所以我试过了;
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility =
JsonAutoDetect.Visibility.NONE, setterVisibility =
JsonAutoDetect.Visibility.NONE)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =
JsonTypeInfo.As.EXTERNAL_PROPERTY , property = "typeId")
@JsonSubTypes({
@JsonSubTypes.Type(value = BChildOne.class, name = "40ad2fe6-e672-4f0e-
986e-
619c7a1a3223") }
)
public abstract class B{
但我收到以下错误;
意外的令牌 (END_OBJECT),预期的 FIELD_NAME:缺少包含类型 ID 的属性“typeId”(对于 B 类)
这很明显,因为 typeId 字段在 A 类而不是 B 类中。
解决方案
假设您的 JSON 文档如下所示:
{
"type": "foo",
"data": {
"someCommonProperty": "common property",
"fooProperty": "foo specific property"
}
}
{
"type": "bar",
"data": {
"someCommonProperty": "common property",
"barProperty": "bar specific property"
}
}
您可以使用:
public class Wrapper {
private String type;
@JsonTypeInfo(use = Id.NAME, property = "type", include = As.EXTERNAL_PROPERTY)
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = Foo.class, name = "foo"),
@JsonSubTypes.Type(value = Bar.class, name = "bar")
})
private AbstractData data;
// Getters and setters
}
public abstract class AbstractData {
private String someCommonProperty;
// Getters and setters
}
public class Foo extends AbstractData {
private String fooProperty;
// Getters and setters
}
public class Bar extends AbstractData {
private String barProperty;
// Getters and setters
}
在这种方法中,@JsonTypeInfo
设置为使用type
外部属性来确定正确的类来映射data
属性。JSON文档可以反序列化如下:
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = mapper.readValue(json, Wrapper.class);
推荐阅读
- unity3d - 有什么方法可以阻止 Visual Studio 在新函数上添加“抛出新的 NotImplementedException”?导致命名空间与 Unity 冲突
- excel - 日历年的付款发票跟踪
- java - Guice volatile 注入属性之一
- numpy - 总结字典中的值
- javascript - JavaScript,在新选项卡中打开编码为 Base64 的 pdf,无需在 Google-Chrome 中下载
- javascript - 如何将下一个文本区域聚焦在按钮单击上
- react-native - ActivityIndicator 抛出类型错误 undefined is not an object
- php - 如果用户在 .htaccess 文件的 codeigniter 中输入 abc.com,如何将页面重定向到 www.abc.com
- android - 如何将当前交通数据绘制到谷歌地图上由谷歌方向 API 绘制的特定折线上
- swift - 如何在使用 URLSession 的异步 api 调用中查找哪个响应属于哪个请求