使用Gson将JSON数组转换为Java ArrayList时属性始终为空如何解决
问题原因
- 注解框架不匹配:你代码中使用的
@JsonAlias、@JsonNaming均为Jackson序列化框架的专属注解,但你实际执行JSON转对象时用的是Gson框架,Gson无法识别这些Jackson注解,无法将JSON中的ax21:cHType、ax21:cardNumber字段和Java类属性做映射,因此所有属性赋值为null。 - 次要排查点:检查你实际返回的JSON中
cardNumber字段类型,如果为纯数字类型,Gson默认会解析为Number类型,用String类型接收也可能出现类型不匹配导致的null。
解决方法
方法1:替换为Gson原生注解(推荐)
修改SpecCifInfo类,移除Jackson相关注解,改用Gson的@SerializedName指定字段映射关系:
@Data @AllArgsConstructor @NoArgsConstructor public final class SpecCifInfo { @SerializedName("ax21:cHType") private String cHType; @SerializedName("ax21:cardNumber") private String cardNumber; }
如果实际JSON中cardNumber为纯数字,可将属性类型改为Long/Number,也可以配置Gson开启自动类型转换。
方法2:改用Jackson框架做序列化
如果你需要保留现有的Jackson注解,直接替换序列化实现即可:
ObjectMapper objectMapper = new ObjectMapper(); List<SpecCifInfo> specDetails = objectMapper.readValue(specCifDetailsReturn.toString(), new TypeReference<List<SpecCifInfo>>() {});
补充优化:日志打印修正
你当前的日志写法LOGGER.debug("Spec CIF Details", 内容)第一个参数没有占位符{},部分日志框架会直接忽略第二个参数,建议调整为:
LOGGER.debug("Spec CIF Details: {}", specInfo.getCHType() + "-" + specInfo.getCardNumber());
内容的提问来源于stack exchange,提问作者iamjoshua
相关产品推荐
相关产品推荐

