Spring Boot中如何将JSON数组映射为Java实体类?
正确映射外部API JSON的Java实体类方案
错误原因分析
你的实体类定义存在三个核心问题:
- data字段映射错误:原JSON中
data是直接的Coin对象数组,你却额外套了一层Data类,导致Jackson无法匹配数组结构。 - quote字段类型错误:
quote的value是包含price的价格对象,并非Coin类型,你定义的Map<String, Coin>完全不符合JSON结构。 - 缺少Status实体类:你在MainDTO中声明了Status字段,但未实现对应的实体类。
正确的实体类定义
1. MainDTO(主实体类)
@AllArgsConstructor @NoArgsConstructor @Getter @Setter public class MainDTO { @JsonProperty("status") private Status status; @JsonProperty("data") // 直接用List接收JSON数组,无需额外包装类 private List<Coin> data; }
2. Status类(映射status节点)
@AllArgsConstructor @NoArgsConstructor @Getter @Setter public class Status { @JsonProperty("timestamp") private String timestamp; @JsonProperty("error_code") private Integer errorCode; @JsonProperty("error_message") private String errorMessage; }
3. Coin类(映射data数组中的元素)
@AllArgsConstructor @NoArgsConstructor @Getter @Setter public class Coin { @JsonProperty("id") private Integer id; @JsonProperty("name") private String name; @JsonProperty("tags") private List<String> tags; // quote的key是币种(USD/BTC),value是包含price的对象,用Map<String, QuotePrice>匹配 @JsonProperty("quote") private Map<String, QuotePrice> quote; }
4. QuotePrice类(映射quote中的价格节点)
@AllArgsConstructor @NoArgsConstructor @Getter @Setter public class QuotePrice { @JsonProperty("price") private Double price; }
补充说明
- 用
List代替数组更灵活,Jackson会自动完成JSON数组到List的转换。 - 所有字段建议加上
@JsonProperty注解,确保JSON键与Java字段名严格匹配(尤其是下划线命名的JSON键,比如error_code对应Java的errorCode)。 - 如果不需要全参构造器,仅保留
@NoArgsConstructor即可,Jackson反序列化只依赖无参构造。
内容的提问来源于stack exchange,提问作者Dany
相关产品推荐
相关产品推荐

