java jackson解析json数组

时间:2018-02-28 11:41:45

标签: java json parsing jackson

我需要解析帮助,我试图创建一个不同类型的模型类,但没有用,请在这里帮助我。 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的实例, 请帮忙

3 个答案:

答案 0 :(得分:2)

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

您有几个选择如何继续:

  1. 从杰克逊改为标准JSON解析,正如@ {cricket_007在answer
  2. 上所建议的那样
  3. 不是将其映射到对象,而是尝试以不同方式访问JSON。有关示例,请参阅@ jschnasse&#39; s answer
  4. 如果可以
  5. ,请更改您解析的文字格式
  6. 如果您无法更改输入的格式,那么您也可以
    • 创建一个构造函数并使用@JsonCreator注释它,就像指示here
    • 一样
    • 将输入解析为Object数组,并将解析后的数组提供给您自己的构造函数

答案 1 :(得分:1)

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

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

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

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

另外,您的列表包含字符串和整数,因此您只能反序列化为TypeReference<List<List<Object>>>,然后迭代它以解析整数,浮点数或字符串

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

答案 2 :(得分:1)

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