如何反序列化嵌套数组中的字段并获取指定值?
解决嵌套JSON字段提取与序列化问题
咱们先拆解下你遇到的核心问题:想把JSON里name[0].given的值映射到fstNm,同时序列化时只输出fstNm,但实际结果不仅fstNm没按预期生效,还额外带出了整个name数组。
问题核心原因
name字段未被排除序列化:Jackson默认会把POJO中所有带getter的字段都序列化输出,所以你的name数组会被原样保留在结果里。- 字段与getter/setter命名不一致:
dummyID和dummyId的大小写不匹配,会导致Jackson无法正确映射该字段。 - 缺乏空指针防护:直接强转
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
相关产品推荐
相关产品推荐

