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

Java Jackson处理嵌套JSON报错,如何正确定义对应Java实体类?

解决Jackson反序列化嵌套JSON的类型不匹配问题

先看你的JSON结构:

{   
   "resources" : {     
        "foo" : {       
          "value" : "test"      
         },     
        "bar" : {       
          "value" : "test"     
         }    
   } 
}

你之前的两个Java类定义都存在类型匹配错误:

  1. 第一个类里,你把resources的泛型定义成HashMap<String, HashMap<String, List<String>>>,但JSON里每个foo/bar对象的value是字符串("test"),不是列表,Jackson自然无法把字符串转换成ArrayList,这就是你看到MismatchedInputException的原因。
  2. 第二个类把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:15:35