You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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数组里的可选字段(就是你写的...部分):
    1. 如果知道字段含义,直接在Position类里按顺序添加对应字段
    2. 如果不知道,或者想忽略额外元素,可以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:38:43