Java Jackson映射器跳过类名(反序列化问题)
我有一个例子:Java Jackson映射器跳过类名(反序列化问题),java,spring,spring-boot,jackson,fasterxml,Java,Spring,Spring Boot,Jackson,Fasterxml,我有一个例子: @Getter @Setter @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) public class ExampleClass implements Serializable { private String name; pri
@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=JsonTypeInfo.As.WRAPPER\u对象)指定了类,因此它正在尝试将“NAME”字段从收到的json映射到“ExampleClass”,并抛出一个错误:
无法将类型id“name”解析为的子类型
com.example.package.dto.ExampleClass
:已知类型ID=
[示例类]
我知道,如果我删除@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER_OBJECT)或将其更改为use=JsonTypeInfo.Id.NONE,反序列化将起作用,但序列化的json最终会发生更改,因此我无法这样做
我还知道,如果我想添加自定义反序列化程序,我还需要添加自定义序列化程序,因为@JsonTypeInfo注释会使jackson忽略您在注释中指定的任何反序列化程序。但是我真的希望避免这种情况,因为实际的类有很多字段,自定义映射类看起来非常难看
我如何告诉jackson跳过“ExampleClass”字段并将其映射到其内部字段,或者指定不同的字段
我使用的是fasterxml.jackson,没有代码库。有趣的是,当我写下我的问题时,我想出了解决方案,只是实现了它并尝试了一下,结果它工作得非常完美 我是这样做的:
@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);
如果你认为有更好的方法解决这个问题,请随时纠正我
为在stackoverflow中写问题的调试鸭子欢呼不,没关系,这会帮助其他人。