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

嵌套JSON转POJO映射问题排查:无报错但值返回Null

嵌套JSON映射POJO返回全Null问题排查

以下是核心排查点及对应解决方案:

1. 转换代码误用字面量字符串而非真实JSON内容

你的转换代码中写了:

resp = objMap.readValue("jsonString",Response.class);

这里的"jsonString"是普通字面量,并非Cassandra存储的实际JSON数据。Jackson解析无效字符串时会生成空的Response实例,所有字段自然为Null。

修复方式:传入从Cassandra读取到的真实JSON内容,示例:

// 从Cassandra获取的实际JSON字符串
String actualJson = "{\"fullname\": \"Darla Kertzmann\",\"address\": {\"street\": \"4519 Mraz Point\",\"city\": {\"cityName\":\"Melbourne\",\"cityCode\":\"0000\"}}}";
Response resp = objMap.readValue(actualJson, Response.class);

2. Lombok的@Data注解未生效

@Data注解会自动生成getter、setter等方法,若Lombok未正确配置,Jackson无法通过反射为私有字段赋值,导致所有字段为Null。

验证与修复:

  • 检查项目依赖:确保已引入Lombok依赖
    • Maven pom.xml示例:
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.30</version>
          <scope>provided</scope>
      </dependency>
      
  • 检查IDE配置:安装Lombok插件,并开启「Enable Annotation Processing」选项(IDEA在Settings -> Build -> Compiler -> Annotation Processors中勾选)

3. Response类缺失fullname字段映射

JSON中包含fullname字段,但Response类仅注释了//fullname mock here,未定义对应属性。虽不会直接导致address字段为Null,但会丢失fullname数据,建议补充:

@Data
public class Response{
    @JsonProperty("fullname")
    private String fullname;
    
    @JsonProperty("address")
    private Address address;
}

4. ObjectMapper配置禁用了自动检测

若手动修改过ObjectMapper配置,可能关闭了字段自动检测功能,导致Jackson无法识别私有字段。可显式开启:

ObjectMapper objMap = new ObjectMapper();
// 开启字段与setter方法的自动检测
objMap.enable(MapperFeature.AUTO_DETECT_FIELDS);
objMap.enable(MapperFeature.AUTO_DETECT_SETTERS);

5. 嵌套类访问权限问题

确保Address和City类为public修饰,且与Response类在同一包下或具备可访问权限。若嵌套类是私有内部类,Jackson无法实例化,会导致对应字段为Null。

验证方法

可通过反向序列化测试确认实体类配置是否正确:手动实例化实体类并序列化为JSON,看输出是否与原测试JSON结构一致:

Response testResp = new Response();
testResp.setFullname("Darla Kertzmann");
Address addr = new Address();
addr.setStreet("4519 Mraz Point");
City city = new City();
city.setCityName("Melbourne");
city.setCityCode("0000");
addr.setCity(city);
testResp.setAddress(addr);

// 序列化为JSON
String json = objMap.writeValueAsString(testResp);
System.out.println(json);

若输出JSON与原测试JSON结构一致,说明实体类配置无问题,问题大概率出在JSON输入或Lombok配置上。

内容的提问来源于stack exchange,提问作者Jake samuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:00:59