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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:01:20