使用Jackson解析嵌套JSON数组:实体类构造方法咨询
解决Jackson解析嵌套数组JSON的问题
嘿,我明白你的困惑——这个JSON结构确实不是常规的键值对格式,而是混合类型的顶级数组,处理起来需要一点特殊配置。让我一步步帮你搞定:
首先明确JSON结构细节
你的JSON是这样的格式:
[ "CHAN_ID_VALUE", [ [ "BTC/USD", "ACTIVE", 0.01, 30000.0, 0.0, "daily", 50.0, 0.17, 28000.0, 10, // 其他可选字段... ], // 更多Position数组... ] ]
简单来说:
- 顶级是一个包含2个元素的数组:第一个是频道ID(CHAN_ID),第二个是Position信息的数组列表
- 每个Position本身又是一个无键数组,元素按固定顺序对应不同的属性
步骤1:定义Position实体类
因为Position是无键数组,我们需要告诉Jackson按顺序把数组元素映射到字段上。用@JsonFormat指定数组格式,再用@JsonPropertyOrder明确字段和数组元素的对应顺序:
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.*; import java.math.BigDecimal; @Getter @Setter @EqualsAndHashCode @ToString @NoArgsConstructor @AllArgsConstructor @JsonFormat(shape = JsonFormat.Shape.ARRAY) // 告诉Jackson这个类对应数组结构 @JsonPropertyOrder({ "SYMBOL", "STATUS", "AMOUNT", "BASE_PRICE", "MARGIN_FUNDING", "MARGIN_FUNDING_TYPE", "PL", "PL_PERC", "PRICE_LIQ", "LEVERAGE" // 这里可以继续添加后续的字段,和JSON数组元素顺序对应 }) public class Position { private String SYMBOL; private String STATUS; private BigDecimal AMOUNT; private BigDecimal BASE_PRICE; private BigDecimal MARGIN_FUNDING; private String MARGIN_FUNDING_TYPE; private BigDecimal PL; private BigDecimal PL_PERC; private BigDecimal PRICE_LIQ; private Integer LEVERAGE; // 如果有额外的可选字段,可以在这里继续添加,保持顺序一致 }
步骤2:定义顶级容器类
顶级数组包含CHAN_ID和Position列表,同样用数组格式映射:
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.*; import java.util.List; @Getter @Setter @EqualsAndHashCode @ToString @NoArgsConstructor @AllArgsConstructor @JsonFormat(shape = JsonFormat.Shape.ARRAY) @JsonPropertyOrder({"CHAN_ID", "POSITIONS"}) public class PositionContainer { private String CHAN_ID; // 根据实际类型调整,比如如果是数字就用Long/Integer private List<Position> POSITIONS; }
步骤3:解析JSON代码示例
现在可以用Jackson的ObjectMapper来解析这个JSON了:
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class JsonParser { public static void main(String[] args) throws IOException { String json = "[\"123\", [[\"BTC/USD\", \"ACTIVE\", 0.01, 30000.0, 0.0, \"daily\", 50.0, 0.17, 28000.0, 10]]]"; ObjectMapper objectMapper = new ObjectMapper(); PositionContainer container = objectMapper.readValue(json, PositionContainer.class); System.out.println("频道ID: " + container.getCHAN_ID()); for (Position pos : container.getPOSITIONS()) { System.out.println("持仓信息: " + pos); } } }
额外注意事项
- 如果CHAN_ID是数字类型,把
PositionContainer里的CHAN_ID字段改成Long或Integer即可 - 对于JSON数组里的可选字段(就是你写的
...部分):- 如果知道字段含义,直接在
Position类里按顺序添加对应字段 - 如果不知道,或者想忽略额外元素,可以在
Position类上添加@JsonIgnoreProperties(ignoreUnknown = true),Jackson会自动忽略未定义的数组元素
- 如果知道字段含义,直接在
- 确保你的项目里引入了Jackson依赖(如果是Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 用最新稳定版即可 --> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>
这样就能完美解析你的特殊JSON结构啦!
内容的提问来源于stack exchange,提问作者javing
相关产品推荐
相关产品推荐

