Spring Boot Jackson Databind - 配置继承
Spring Boot Jackson Databind - Configure Inheritance
假设我有一个基地 class A
:
public class A {
public String a;
}
还有两个childclasses B
和C
:
public class B extends A {
public String b;
}
public class C extends A {
public String c;
}
和 A
的包装 class:
public class Wrapper {
public A a;
}
我有 Rest 控制器接收客户端请求作为包装器 object:
@RestController
public class SomeController {
public void foo(@RequestBody Wrapper wrapper) {}
}
问题是 Jackson 将包装字段转换为基础 class A
。
如何配置它以接收正确的类型?
用告诉 Jackson 如何决定给定的 json 对象是否应该反序列化为 B.java
或 [=14= 的类型信息来注释你的基础 class A
].
Ex:使用下面的代码,我们告诉杰克逊 A.class 的 json 对象将包含一个 属性 和键 type
,其值可以是 "b" 或 "c"。如果值为 "b",则将对象反序列化为 B.class
,否则将其反序列化为 C.class
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = B.class, name = "b"),
@Type(value = B.class, name= "c")
})
class A {
}
以下是您应该使用的json。
{
"a" : { // This will be deserialized to B.class
"type": "b",
// field of B.class
}
}
{
"a" : { // This will be deserialized to C.class
"type": "c",
// field of C.class
}
}
假设我有一个基地 class A
:
public class A {
public String a;
}
还有两个childclasses B
和C
:
public class B extends A {
public String b;
}
public class C extends A {
public String c;
}
和 A
的包装 class:
public class Wrapper {
public A a;
}
我有 Rest 控制器接收客户端请求作为包装器 object:
@RestController
public class SomeController {
public void foo(@RequestBody Wrapper wrapper) {}
}
问题是 Jackson 将包装字段转换为基础 class A
。
如何配置它以接收正确的类型?
用告诉 Jackson 如何决定给定的 json 对象是否应该反序列化为 B.java
或 [=14= 的类型信息来注释你的基础 class A
].
Ex:使用下面的代码,我们告诉杰克逊 A.class 的 json 对象将包含一个 属性 和键 type
,其值可以是 "b" 或 "c"。如果值为 "b",则将对象反序列化为 B.class
,否则将其反序列化为 C.class
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = B.class, name = "b"),
@Type(value = B.class, name= "c")
})
class A {
}
以下是您应该使用的json。
{
"a" : { // This will be deserialized to B.class
"type": "b",
// field of B.class
}
}
{
"a" : { // This will be deserialized to C.class
"type": "c",
// field of C.class
}
}