【问题标题】:IndexOutOfBoundException while Deserializing a json response using jackson使用jackson反序列化json响应时出现IndexOutOfBoundException
【发布时间】:2020-12-08 21:56:48
【问题描述】:

我正在尝试反序列化来自另一个 API 的 json 响应,但我不断收到 indexoutofboundException。下面是我试图反序列化的 json 响应 -

{
  "data" : [ ],
  "metadata" : {
    "transactionId" : "cfba12f56eaf6f24"
  }
}

为了反序列化,我使用下面的实现 -

ResponseEntity<String>response=restTemplate.exchange(meta_uri,HttpMethod.POST,httpEntity,String.class);
            String source=response.getBody();

            mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
            DataResponse metaResponse=mapper.readValue(source,DataResponse.class);

DataResponse.class 看起来像这样 -

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import java.util.ArrayList;

@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
public class DataResponse {

    @JsonProperty
    private ArrayList<APIData>data;


    @JsonProperty
    private MetaData metadata;

}

APIData.class 看起来像这样 -

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.*;
import java.util.*;


@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class APIData {


    @JsonProperty
    private Map<String,Object> key;


    @JsonProperty
    private List<String> contacts;


}

当 json 响应是这样时,我的实现基本上可以工作 -

    {
  "data": [
    {
      "key": "123",
      "contacts": [
        "jon_doe@email.com",
        "jon1_do3@email.com"
      ]
    }
  ],
  "metadata": {
    "transactionId": "11112233333"
  }
}

但是当响应中的数据数组为空时给我 indexOutofBoundException -

{
  "data" : [ ],
  "metadata" : {
    "transactionId" : "cfba12f56eaf6f24"
  }
}

【问题讨论】:

  • 你能显示一个带有详细信息的堆栈跟踪吗? [ "key":"123","contacts": [... 看起来不像是有效的 JSON。你能把它更新到一个有效的版本吗?
  • @MichałZiober 我已经更新了 JSON。对此感到抱歉
  • 您的 josn 数据有误。特别是 data[].key 不适合 obj APIData 的属性键定义。它不是地图格式。它应该像 " "key": { "A": "123", "B": "456" }
  • 只是一个更新,我的问题在做 mapper.readValue 后得到了解决] 不为空或不为空,然后检查数据中的任何字段是否可用。我不再收到 indexoutofboundexception

标签: java spring jackson deserialization


【解决方案1】:

我猜也许发布请求返回的数据是错误的。如您所说,我用字符串进行了测试。这是工作。

    @Test
    public void mapper() throws Exception{
        String json = "{\n" +
                "  \"data\" : [ ],\n" +
                "  \"metadata\" : {\n" +
                "    \"transactionId\" : \"cfba12f56eaf6f24\"\n" +
                "  }\n" +
                "}";

        ObjectMapper mapper = new ObjectMapper();

        mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        DataResponse metaResponse=mapper.readValue( json ,DataResponse.class);
        System.out.println("=========" + metaResponse);


        // output
        // =========DataResponse(data=[], metadata=MetaData(transactionId=cfba12f56eaf6f24))
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2022-01-08
    • 2014-02-12
    相关资源
    最近更新 更多