不溜過客 2025-06-12 21:40 采纳率: 98.1%
浏览 38
已采纳

Jackson反序列化报错:MismatchedInputException Cannot deserialize value of type `com.alibaba.fast`

在使用Jackson进行JSON反序列化时,如果遇到报错:`MismatchedInputException Cannot deserialize value of type com.alibaba.fast`,通常是由于JSON数据结构与目标Java类不匹配导致的。例如,JSON字段缺失、类型不一致或嵌套结构不符合预期。此外,若目标类`com.alibaba.fast`缺少无参构造函数或未正确标注`@JsonProperty`,也会引发此问题。 解决方法包括: 1. 确保JSON格式与目标类字段完全对应。 2. 为目标类添加无参构造函数。 3. 使用`@JsonCreator`和`@JsonProperty`注解处理复杂映射。 4. 开启`FAIL_ON_UNKNOWN_PROPERTIES = false`忽略多余字段。 通过以上调整,可有效解决反序列化异常。
  • 写回答

1条回答 默认 最新

  • 舜祎魂 2025-06-12 21:41
    关注

    1. 问题概述

    在使用Jackson库进行JSON反序列化时,可能会遇到`MismatchedInputException`异常。例如:

    MismatchedInputException Cannot deserialize value of type com.alibaba.fast

    这种错误通常表明JSON数据结构与目标Java类的定义不匹配。以下是可能的原因:

    • JSON字段缺失或类型不一致。
    • 目标类缺少无参构造函数。
    • 目标类未正确标注`@JsonProperty`注解。

    接下来我们将逐步分析并提供解决方案。

    2. 问题分析

    为了解决上述问题,我们需要从以下几个方面入手:

    1. 检查JSON数据格式是否符合目标类的字段定义。
    2. 确保目标类具有默认的无参构造函数。
    3. 验证字段映射是否正确,必要时使用`@JsonProperty`注解。

    以下是一个示例代码片段,展示了一个可能导致异常的目标类:

    
    public class Fast {
        private String name;
        private int speed;
    
        // 缺少无参构造函数
        public Fast(String name, int speed) {
            this.name = name;
            this.speed = speed;
        }
    }
        

    上述类由于缺少无参构造函数,可能导致反序列化失败。

    3. 解决方案

    根据问题分析,我们可以采取以下措施解决问题:

    解决方案描述
    确保JSON格式与目标类字段完全对应检查JSON字段名称和类型是否与目标类一致。
    为目标类添加无参构造函数为类添加一个无参构造函数以支持Jackson实例化。
    使用`@JsonCreator`和`@JsonProperty`注解处理复杂映射场景,例如字段名不一致的情况。
    开启`FAIL_ON_UNKNOWN_PROPERTIES = false`忽略JSON中多余的字段,避免因未知字段导致的异常。

    4. 示例代码调整

    以下是对目标类的改进版本:

    
    public class Fast {
        private String name;
        private int speed;
    
        // 添加无参构造函数
        public Fast() {}
    
        // 使用@JsonCreator和@JsonProperty注解
        @JsonCreator
        public Fast(@JsonProperty("name") String name, 
                    @JsonProperty("speed") int speed) {
            this.name = name;
            this.speed = speed;
        }
    
        // Getter和Setter方法
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public int getSpeed() { return speed; }
        public void setSpeed(int speed) { this.speed = speed; }
    }
        

    此外,在反序列化时可以配置如下:

    
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        

    5. 流程图

    以下是解决`MismatchedInputException`问题的流程图:

    graph TD; A[开始] --> B{JSON字段是否匹配}; B --是--> C{目标类是否有无参构造函数}; C --否--> D[为目标类添加无参构造函数]; C --是--> E{是否需要复杂映射}; E --是--> F[使用@JsonCreator和@JsonProperty注解]; E --否--> G{是否需要忽略多余字段}; G --是--> H[设置FAIL_ON_UNKNOWN_PROPERTIES=false]; G --否--> I[完成];
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 6月12日