使用Jackson将JSON数据读取到数组/列表时遇到问题
解决Jackson反序列化JSON时的构造函数参数不匹配问题
老哥,我瞅了下你的问题,大概率是Jackson反序列化的时候踩了构造函数参数和JSON字段不匹配的坑!咱们一步步捋清楚:
问题根源
你的JSON数据里每个对象只有atcID字段:
[ { "atcID": "AL011851" }, { "atcID": "AL021851" } ]
但你的StormData构造函数要求两个参数:atcID和name,而且你大概率没给构造函数参数加@JsonProperty注解——Jackson既找不到name字段的值,又没法把JSON里的atcID和构造函数参数对应起来,自然就报错了。
针对性解决方案
根据你的需求,分两种情况处理:
情况1:name是可选字段(允许为null)
给构造函数的参数加上@JsonProperty明确映射关系,同时给name参数留默认值,或者重载一个只接收atcID的构造函数:
public class StormData { private String atcID; private String name; // 方案A:带可选参数的构造函数,加@JsonProperty映射 @JsonCreator public StormData(@JsonProperty("atcID") String atcID, @JsonProperty("name") String name) { this.atcID = atcID; this.name = name; // JSON里没有name的话,这里会是null } // 方案B:重载只需要atcID的构造函数,更直观 @JsonCreator public StormData(@JsonProperty("atcID") String atcID) { this.atcID = atcID; this.name = ""; // 或者设为null,根据你的需求来 } // 别忘了加getter(如果需要序列化或者外部访问字段的话) public String getAtcID() { return atcID; } public String getName() { return name; } }
情况2:name是必填字段
那你得修改JSON数据,给每个对象补充name字段:
[ { "atcID": "AL011851", "name": "飓风卡特里娜" }, { "atcID": "AL021851", "name": "飓风桑迪" } ]
同时构造函数的参数依然要加@JsonProperty注解,确保字段映射正确。
测试验证
用ObjectMapper测试反序列化:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class Test { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); String json = "[ { \"atcID\": \"AL011851\" }, { \"atcID\": \"AL021851\" } ]"; List<StormData> stormList = mapper.readValue(json, new TypeReference<List<StormData>>() {}); // 打印结果验证 stormList.forEach(storm -> System.out.printf("atcID: %s, name: %s%n", storm.getAtcID(), storm.getName()) ); } }
内容的提问来源于stack exchange,提问作者rkwright
相关产品推荐
相关产品推荐

