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

如何使用Java通过ObjectMapper将PostgreSQL返回的JSON反序列化为对应POJO

问题根因
  • 字段名不匹配:返回的JSON结构中顶层字段为query_name、query_type,而你定义的Information类中对应属性名为name、type,Jackson默认按属性名严格匹配,无法完成自动映射。
  • 类型不兼容:JSON中age字段为字符串格式(值为带双引号的"35"),而User类中对应属性为Integer类型,默认配置下Jackson不会自动执行字符串到数字的类型转换。
解决步骤

1. 配置字段映射关系

在Information类的对应属性上添加@JsonProperty注解,明确指定JSON字段名和POJO属性的映射关系:

@Getter
@Setter 
class Information {
    @JsonProperty("query_name")
    String name;
    @JsonProperty("query_type")
    String type;
    List<User> details; 
}

@Getter
@Setter 
class User {
    String name; 
    Integer age;
    Boolean isUpdate; 
}

2. 配置ObjectMapper反序列化规则

调整ObjectMapper的配置,开启自动类型转换、忽略未知字段等常用规则,避免兼容问题:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

// 初始化ObjectMapper并配置规则
ObjectMapper objectMapper = new ObjectMapper();
// 允许将字符串类型的数值转换为数字类型,解决age字段类型不匹配问题
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
// 忽略JSON中存在但POJO中没有定义的字段,避免反序列化报错
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 可选配置:允许字符串格式的布尔值(如"true"/"false")转换为Boolean类型
objectMapper.configure(DeserializationFeature.ACCEPT_STRING_AS_BOOLEAN, true);

3. 执行反序列化

直接调用ObjectMapper的readValue方法完成转换即可:

// jsonStr为从PostgreSQL函数获取的JSON字符串
Information result = objectMapper.readValue(jsonStr, Information.class);
验证效果

反序列化完成后可直接通过POJO的get方法获取对应值:

  • result.getName() 返回值为information1,对应JSON中的query_name字段
  • result.getType() 返回值为information2,对应JSON中的query_type字段
  • result.getDetails().get(0).getAge() 返回Integer类型的35,完成了字符串到数字的自动转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03