Aks*_*rma 1 java json jackson fasterxml
我正在尝试使用 jackson 2.6.3 将对象序列化为 json 我想在序列化的 json 中包含类型信息。这不适用于嵌套在此类中的成员。
这是测试代码。
public class Test {
@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteA implements A {
}
@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteB.class)})
interface B {
}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteB implements B {
A a;
public A getA() {
return a=new ConcreteA();
}
}
@org.junit.Test
public void testSerialisation() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
System.out.println(objectMapper.writeValueAsString(new ConcreteB()));
}
}
Run Code Online (Sandbox Code Playgroud)
jackson 正在转换的 json 是
{"@class":"Test$ConcreteB","a":{}}
Run Code Online (Sandbox Code Playgroud)
请注意,它不包括字段“a”的类型信息。仅序列化 A 时确实包含类型信息。
{"@class":"Test$ConcreteA"}
Run Code Online (Sandbox Code Playgroud)
更新:这是 jackson dev 对这个问题的解释和解决方案 https://github.com/FasterXML/jackson-databind/issues/1015
看起来您已经很接近了,您需要添加的只是一种告诉 jackson 如何处理您的接口类型的方法。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@class")
@JsonSubTypes({
@JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
Run Code Online (Sandbox Code Playgroud)
因此,将 添加@JsonTypeInfo到您的界面会将类型信息添加到您可以配置为您期望的属性中,在本例中我选择了@class。
我从我的例子中得到的 Json 输出:
{"@class":"com.company.jackson.Test$ConcreteB","a":{"@type":"Test$ConcreteA"}}
希望能帮助到你,
何塞·路易斯
| 归档时间: |
|
| 查看次数: |
6503 次 |
| 最近记录: |