Jackson映射器跳过类名(反序列化问题)



我有一个示例类:

@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 中编写问题的调试鸭子

相关内容

  • 没有找到相关文章

最新更新