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类封装。
示例代码
- 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; } }
- 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; } }
- 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
相关产品推荐
相关产品推荐

