代码之家  ›  专栏  ›  技术社区  ›  secario

java jackson解析json数组

  •  0
  • secario  · 技术社区  · 7 年前

    我需要解析方面的帮助,我试图创建不同类型的模型类,但没有用,请在这里帮助我。json如下所示:

    [
      [
        1518909300000,
        "0.08815700",
        "0.08828700",
        "0.08780000",
        "0.08792900",
        "1727.93100000",
        1518910199999,
        "152.11480375",
        5118,
        "897.71600000",
        "79.04635703",
        "0"
      ],
      [
        1518910200000,
        "0.08788400",
        "0.08824200",
        "0.08766200",
        "0.08810000",
        "1789.81300000",
        1518911099999,
        "157.20177729",
        6201,
        "898.89500000",
        "78.95697080",
        "0"
      ]
    ]
    

    我尝试使用数据类对其进行解析:

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class KlineResponse {
    
        public List<Kline> getKlineList() {
            return klineList;
        }
    
        public List<Kline> klineList;
    
        public class Kline {
            @JsonProperty("4")
            Double close;
    
            @JsonProperty("8")
            Integer tradesNumber;
    
            public Double getClose() {
                return close;
            }
    
            public void setClose(Double close) {
                this.close = close;
            }
    
            public Integer getTradesNumber() {
                return tradesNumber;
            }
    
            public void setTradesNumber(Integer tradesNumber) {
                this.tradesNumber = tradesNumber;
            }
        }
    }
    

    还有这条线

    mapper.readValue(response.getBody(), new TypeReference<List<KlineResponse>>(){})
    

    mapper.readValue(response.getBody(), KlineResponse.class)
    

    但每次出错时: 无法反序列化pt的实例。设置。模型KlineResponse out of START\u数组标记, 请帮忙

    3 回复  |  直到 7 年前
        1
  •  2
  •   JussiV    7 年前

    核心问题是,您将在预期的位置接收一个数组和一个对象数组。改变 mapper.readValue(response.getBody(), KlineResponse.class) mapper.readValue(response.getBody(), Object[].class) 确认它。

    关于如何继续,您有几个选项:

    1. 根据@cricket\u 007的建议,从Jackson改为标准JSON解析 answer
    2. 与其将其映射到对象,不如尝试以不同的方式访问JSON。见@jschnasse的 answer 例如。
    3. 如果可以,请更改所分析文本的格式
    4. 如果无法更改输入的格式,则可以
      • 创建一个构造函数并用@JsonCreator对其进行注释,如所示 here
      • 将输入解析为对象数组,并将解析后的数组馈送到您自己的构造函数中
        2
  •  1
  •   OneCricketeer Gabriele Mariotti    7 年前

    您不需要任何java类。没有要反序列化的JSON对象,只有数组。

    在第二种情况下,Jackson预期 { "klineList": [] }

    首先, [{ "klineList": [] }, { "klineList": [] }]

    Kline对象只能解析为 {"4": 0.0, "8": 0 } (用任何相同类型的值替换零)。。。所以真的不清楚,鉴于这些数据,你为什么认为这会起作用。。。注释 不是 列表的索引。

    此外,您的列表同时包含字符串和整数,因此只能反序列化为 TypeReference<List<List<Object>>> ,然后对其进行迭代以解析int、float或字符串

    我可能建议您使用标准json解析器,而不是objectmapper

        3
  •  1
  •   Community CDub    3 年前

    使用 JsonNode 连同 JPointer . 避免创建POJO并通过JsonNode直接处理数据。

    ObjectMapper mapper = new ObjectMapper();
    JsonNode matrix = mapper.readValue(in, JsonNode.class);
    matrix.forEach(array -> {
        System.out.println("Next Values:");
        System.out.println(array.at("/4").asDouble());
        System.out.println(array.at("/8").asInt());
    });
    

    印刷品

    Next Values:
    0.087929
    5118.0
    Next Values:
    0.0881
    6201.0