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

如何反序列化嵌套数组中的字段并获取指定值?

解决嵌套JSON字段提取与序列化问题

咱们先拆解下你遇到的核心问题:想把JSON里name[0].given的值映射到fstNm,同时序列化时只输出fstNm,但实际结果不仅fstNm没按预期生效,还额外带出了整个name数组。

问题核心原因

  1. name字段未被排除序列化:Jackson默认会把POJO中所有带getter的字段都序列化输出,所以你的name数组会被原样保留在结果里。
  2. 字段与getter/setter命名不一致:dummyID和dummyId的大小写不匹配,会导致Jackson无法正确映射该字段。
  3. 缺乏空指针防护:直接强转name.get(0).get("given")存在风险,一旦name为空或无元素会直接抛出异常。

修改后的完整POJO代码

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.util.List;
import java.util.Map;

@AllArgsConstructor
@Setter
@Getter
public class TestResponse {
    // 保持字段与JSON键名一致,避免映射错误
    @JsonProperty("dummyID")
    private String dummyID;

    private String fstNm;

    // 用@JsonIgnore标记,让Jackson序列化时忽略该字段
    @JsonIgnore
    private List<Map<String, Object>> name;

    // 在setName方法中完成fstNm的赋值,同时增加空指针防护
    public void setName(List<Map<String, Object>> name) {
        this.name = name;
        if (name != null && !name.isEmpty()) {
            this.fstNm = (String) name.get(0).get("given");
        }
    }

    // 修正getter/setter命名,与字段名保持一致
    public String getDummyID() {
        return dummyID;
    }

    public void setDummyID(String dummyID) {
        this.dummyID = dummyID;
    }
}

关键修改说明

  • @JsonIgnore注解:添加在name字段上,让Jackson序列化时跳过该字段,确保最终输出只有fstNm(和有值的dummyID)。
  • 统一命名规范:修正dummyID的getter/setter命名,避免因大小写不一致导致的映射失败。
  • 空指针防护:在赋值fstNm前先判断name的有效性,避免意外抛出异常。

验证结果

当你用Jackson完成反序列化后,再序列化TestResponse对象,就能得到预期输出:

{"fstNm":"Jon"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:57:46