繁体   English   中英

Java Jackson解析JSON数组

[英]java jackson parse json array

我需要解析方面的帮助,我尝试创建其他类型的模型类,但是没有用,请在这里帮助我。 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)

但是每次错误:无法从START_ARRAY令牌中反序列化pt.settings.model.KlineResponse实例,请帮助

核心问题是您收到期望的数组数组和对象数组。 mapper.readValue(response.getBody(), KlineResponse.class)更改为mapper.readValue(response.getBody(), Object[].class)确认。

您可以选择几种方式进行操作:

  1. 由@ cricket_007在他的答案中建议,从Jackson转换为标准JSON解析
  2. 与其将其映射到对象,不如尝试以其他方式访问JSON。 有关示例,请参见@jschnasse的答案
  3. 如果可以,请更改您解析的文本格式
  4. 如果您无法更改输入格式,则可以
    • 创建一个构造函数并使用@JsonCreator对其进行注释,如此处所示
    • 将输入解析为对象数组,并将解析后的数组馈入您自己的构造函数中

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

在第二种情况下,杰克逊期望{ "klineList": [] }

在第一个[{ "klineList": [] }, { "klineList": [] }]

而且Kline对象仅可解析为{"4": 0.0, "8": 0 } (将零替换为相同类型的任何值)...真的不清楚为什么您期望在给定数据的情况下能够正常工作...注释不是列表的索引。

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

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

JsonNodeJPointer一起使用。 避免创建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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM