Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson映射器跳过类名(反序列化问题)_Java_Spring_Spring Boot_Jackson_Fasterxml - Fatal编程技术网

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

不,没关系,这会帮助其他人。