如何为双层嵌套数组结构的JSON文件构建Java模型
方案1:极简直接映射(无需额外配置)
这个JSON是标准双层数组结构,不需要复杂的自定义配置,直接用嵌套集合接收即可:
- 类型定义:
List<List<BigDecimal>>或List<List<Number>> - 以Jackson反序列化为例,代码示例:
ObjectMapper objectMapper = new ObjectMapper(); // 直接完成反序列化 List<List<BigDecimal>> data = objectMapper.readValue(jsonStr, new TypeReference<List<List<BigDecimal>>>() {});
缺点是没有字段语义,需要自行对应每个下标的含义:下标0为毫秒级时间戳,下标1为开盘价,下标2为最高价,下标3为最低价,下标4为收盘价。
方案2:结构化POJO映射(可读性高、易维护)
推荐使用该方案,通过Jackson的数组序列化注解直接将子数组映射为有语义的POJO,不需要编写自定义反序列化器:
第一步:定义业务POJO
import com.fasterxml.jackson.annotation.JsonFormat; import java.math.BigDecimal; // 声明该类序列化/反序列化时采用数组格式,字段顺序与数组元素顺序严格对应 @JsonFormat(shape = JsonFormat.Shape.ARRAY) public class KlineItem { // 对应子数组下标0:毫秒级时间戳 private Long timestamp; // 对应子数组下标1:开盘价 private BigDecimal open; // 对应子数组下标2:最高价 private BigDecimal high; // 对应子数组下标3:最低价 private BigDecimal low; // 对应子数组下标4:收盘价 private BigDecimal close; // 必须保留无参构造方法 public KlineItem() {} // 全参构造、getter、setter方法自行补充即可 }
第二步:反序列化调用
ObjectMapper objectMapper = new ObjectMapper(); List<KlineItem> klineList = objectMapper.readValue(jsonStr, new TypeReference<List<KlineItem>>() {});
注意事项
- 类上的
@JsonFormat(shape = JsonFormat.Shape.ARRAY)注解必须添加 - POJO的字段顺序必须和JSON子数组的元素顺序完全一致,否则会出现字段值匹配错误
- 价格类字段推荐用BigDecimal类型,避免Double类型的浮点精度丢失问题
内容的提问来源于stack exchange,提问作者amir nourafkan
相关产品推荐
相关产品推荐

