如何使用Jackson扁平化含嵌套数组的JSON并映射到Award实体类?
解决方案
问题根源
原JSON中的Effort字段值并非原生JSON数组,而是被转义的JSON字符串(带双引号包裹、内部字符转义)。Jackson默认会将其识别为String类型,而非可直接解析的JSON结构,因此你之前使用的@JsonUnwrapped注解和数组展开配置无法生效。
推荐方案:自定义Setter方法手动解析
在Award类中添加针对Effort字段的自定义Setter方法,手动将字符串形式的JSON解析为对象,再提取字段值赋值给目标属性:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class Award { @JsonProperty("AwardID") private String awardId; @JsonProperty("AwardTitle") private String awardTitle; private String personFirstName; private String personLastName; // 自定义Setter处理Effort字段的字符串JSON @JsonProperty("Effort") public void setEffort(String effortJson) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); // 将字符串解析为Person数组(因API返回仅一个元素) Person[] persons = mapper.readValue(effortJson, Person[].class); if (persons != null && persons.length > 0) { this.personFirstName = persons[0].getPersonFirstName(); this.personLastName = persons[0].getPersonLastName(); } } // 内部静态类,用于临时解析Effort中的Person对象 private static class Person { @JsonProperty("PersonFirstName") private String personFirstName; @JsonProperty("PersonLastName") private String personLastName; // Getter方法 public String getPersonFirstName() { return personFirstName; } public String getPersonLastName() { return personLastName; } } // Award类的常规Getter/Setter public String getAwardId() { return awardId; } public void setAwardId(String awardId) { this.awardId = awardId; } public String getAwardTitle() { return awardTitle; } public void setAwardTitle(String awardTitle) { this.awardTitle = awardTitle; } public String getPersonFirstName() { return personFirstName; } public String getPersonLastName() { return personLastName; } }
使用方式
直接用ObjectMapper解析即可,无需额外配置数组展开:
ObjectMapper mapper = new ObjectMapper(); Award award = mapper.readValue(jsonString, Award.class);
替代方案:自定义字段反序列化器
如果需要更通用的处理,可以编写JsonDeserializer实现类,通过@JsonDeserialize注解绑定到Award类的对应字段,但上述Setter方法更轻量,适合当前API返回仅一个元素的场景。
内容的提问来源于stack exchange,提问作者Ashley Xu
相关产品推荐
相关产品推荐

