如何使用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
相关产品推荐
相关产品推荐

