RestTemplate调用CoinDesk API后Jackson映射实体类bpi字段为空求助
问题分析
Jackson默认遵循JavaBean命名规范,会将实体类字段名转换为小写开头的键名(如USD→usd)去匹配JSON数据,但CoinDesk API返回的bpi节点下的键是全大写的"USD"、"GBP"、"EUR",导致字段无法匹配,最终返回null。
解决方案
方案一:给目标字段添加@JsonProperty注解(推荐)
直接在CurrentDetail类的字段上指定JSON对应的键名,精准匹配:
@Data @AllArgsConstructor @NoArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class CurrentDetail { @JsonProperty("USD") private CurrentInfo USD; @JsonProperty("GBP") private CurrentInfo GBP; @JsonProperty("EUR") private CurrentInfo EUR; }
方案二:全局配置ObjectMapper命名策略
如果存在大量全大写键的场景,可修改ObjectMapper的命名策略,使其完全按照字段名原样匹配:
ObjectMapper objectMapper = new ObjectMapper(); // 使用IDENTITY策略,保持字段名与JSON键完全一致 objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.IDENTITY); CurrentPrice currentPrice = objectMapper.readValue(result, CurrentPrice.class);
验证效果
修改后重新执行代码,bpi下的USD、GBP、EUR字段将正确映射为CurrentInfo实例,输出结果与预期一致。
内容的提问来源于stack exchange,提问作者YYC
相关产品推荐
相关产品推荐

