Java Jackson处理嵌套JSON报错,如何正确定义对应Java实体类?
解决Jackson反序列化嵌套JSON的类型不匹配问题
先看你的JSON结构:
{ "resources" : { "foo" : { "value" : "test" }, "bar" : { "value" : "test" } } }
你之前的两个Java类定义都存在类型匹配错误:
- 第一个类里,你把
resources的泛型定义成HashMap<String, HashMap<String, List<String>>>,但JSON里每个foo/bar对象的value是字符串("test"),不是列表,Jackson自然无法把字符串转换成ArrayList,这就是你看到MismatchedInputException的原因。 - 第二个类把HashMap的key定义成
List<String>,但JSON里resources的key是普通字符串(foo、bar),完全不匹配。
这里有两种靠谱的解决方案,推荐第一种(更符合面向对象设计,可读性更强):
方案一:自定义实体类映射嵌套对象
创建一个专门的类来表示resources下的每个子对象(比如foo、bar),然后在主类里用HashMap<String, 自定义类>来映射resources:
1. 定义子对象类ResourceItem
package org.example.model; import com.fasterxml.jackson.annotation.JsonProperty; public class ResourceItem { @JsonProperty("value") private String value; // 必须提供Getter和Setter,Jackson需要这些来完成反序列化 // 如果你用Lombok,可以直接加@Data注解替代手动写Getter/Setter public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
2. 定义主类JsonTwoJavaFileModel
package org.example.model; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.HashMap; public class JsonTwoJavaFileModel { @JsonProperty("resources") private HashMap<String, ResourceItem> resources; // Getter和Setter public HashMap<String, ResourceItem> getResources() { return resources; } public void setResources(HashMap<String, ResourceItem> resources) { this.resources = resources; } }
这种方式的好处是结构清晰,后续如果resources的子对象新增字段,只需要修改ResourceItem类即可,维护成本低。
方案二:直接用嵌套HashMap(适合简单场景)
如果你的JSON结构不会变,且子对象只有value这一个字段,也可以直接用嵌套的HashMap来映射,不需要自定义类:
package org.example.model; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.HashMap; public class JsonTwoJavaFileModel { @JsonProperty("resources") private HashMap<String, HashMap<String, String>> resources; // Getter和Setter public HashMap<String, HashMap<String, String>> getResources() { return resources; } public void setResources(HashMap<String, HashMap<String, String>> resources) { this.resources = resources; } }
这里把内层HashMap的泛型改成<String, String>,因为value对应的是字符串值,这样Jackson就能正确反序列化了。
内容的提问来源于stack exchange,提问作者java_learner
相关产品推荐
相关产品推荐

