You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON转Java POJO抛出MismatchedInputException异常求助

解决Jackson反序列化MismatchedInputException问题

问题现象

使用Jackson将JSON字符串转换为TopologyResponse类型POJO时,抛出com.fasterxml.jackson.databind.exc.MismatchedInputException,异常提示:无法构造Resource实例,没有可从字符串值'1'反序列化的字符串参数构造方法/工厂方法,错误路径指向data.byId.resources下的id字段。

根因分析

你的JSON结构中,data.byId.resources是id字符串到Resource对象的映射(即Map<String, Resource>结构),但POJO中的Resources类额外封装了一层@JsonProperty("resources")的Map字段,导致Jackson解析时出现结构不匹配:它会把JSON里的id值(如'1')误认为是要反序列化为Resource的输入,而Resource类没有接收字符串参数的构造方法,因此抛出异常。

解决方案

调整POJO结构,移除多余的封装层

直接让ById类持有Map<String, Resource>类型的resources字段,并用@JsonProperty("resources")标注该字段,去掉中间多余的Resources类封装。

示例代码

  1. Resource类(对应JSON中的资源对象):
public class Resource {
    private String id;
    private String displayName;

    // 必须提供无参构造方法,Jackson反序列化依赖它
    public Resource() {}

    // Getter和Setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getDisplayName() { return displayName; }
    public void setDisplayName(String displayName) { this.displayName = displayName; }
}
  1. ById类(对应JSON中的data.byId节点):
public class ById {
    @JsonProperty("resources")
    private Map<String, Resource> resources;

    // Getter和Setter方法
    public Map<String, Resource> getResources() { return resources; }
    public void setResources(Map<String, Resource> resources) { this.resources = resources; }
}
  1. TopologyResponse类(顶层POJO):
public class TopologyResponse {
    @JsonProperty("data")
    private Data data;

    // Getter和Setter方法
    public Data getData() { return data; }
    public void setData(Data data) { this.data = data; }

    // 内部类Data对应JSON中的data节点
    public static class Data {
        @JsonProperty("byId")
        private ById byId;

        // Getter和Setter方法
        public ById getById() { return byId; }
        public void setById(ById byId) { this.byId = byId; }
    }
}

额外注意事项

  • 所有需要Jackson反序列化的POJO类,必须提供无参构造方法,否则Jackson无法实例化对象。
  • 确保@JsonProperty注解的名称与JSON中的节点名称完全一致(大小写敏感)。

内容的提问来源于stack exchange,提问作者Vinita A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:31:10