我有一个示例类:
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
public class ExampleClass implements Serializable {
private String name;
private String color;
}
此类序列化为:
{
"ExampleClass":{
"name":"This is some name",
"color":"This is some color"
}}
这是预期的行为,我不应该更改它。但我首先收到的文件是json:
{
"name":"This is some name",
"color":"This is some color"
}
我需要将它映射到我的ExampleClass,通常你只需简单地执行以下操作:
ExampleClass example = new ObjectMapper().readValue(jsonFile, ExampleClass.class);
但是,由于我已经用注释@JsonTypeInfo指定了类(use=JsonTypeInfo.Id.NAME,include=JsonType Info.As.WRAPPER_OJECT(,它试图将接收到的json中的"NAME"字段映射到"ExampleClass",并抛出错误:
无法将类型id"name"解析为的子类型
com.example.package.dto.ExampleClass
:已知类型id=〔ExampleClass〕
我知道,如果我删除@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER_OJECT(或将其更改为use=Json TypeInfo,反序列化将起作用。Id.NONE,但后来序列化的json最终发生了更改,所以我不能这么做。
我还知道,如果我想添加一个自定义的反序列化程序,我还需要添加一个定制的序列化程序,因为@JsonTypeInfo注释会使jackson忽略您在注释中指定的任何反序列化程序。但我真的想避免这种情况,因为实际的类有很多字段,自定义映射类看起来会很难看。
我如何告诉jackson跳过"ExampleClass"字段并将其映射到它的内部字段,或者指定不同的字段?
我使用的是fasterxml.jackson,没有codehaus。
有趣的是,当我写下我的问题时,我想出了解决方案,只需要实现并尝试一下,它就完美地工作了!
以下是我的做法:
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
// no more @JsonTypeInfo here
public class ExampleClass implements Serializable {
private String name;
private String color;
}
我从ExampleClass中删除了@JsonTypeInfo,因为这个类将用于将接收到的json反序列化到它。然后我创建了第二个"包装器"类,我将使用它来序列化数据:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
public class ExampleClassWrapper extends ExampleClass {
public ExampleClassWrapper(ExampleClass ex) {
super(ex.getName(), ex.getColor());
}
现在,当json出现时,我可以在一行中读取它而不会出错:
ExampleClass example = new ObjectMapper().readValue(jsonFile, ExampleClass.class);
当我需要序列化这些数据时(例如,将其作为请求发送(,我只发送ExampleClassWrapper:
ExampleClassWrapper wrapper = new ExampleClassWrapper(example);
exampleRestService.sendExampleRequest(wrapper);
如果你认为有更好的方法来解决这个问题,请随时纠正我。
第页。S.HURRAY为正在stackoverflow 中编写问题的调试鸭子