简体   繁体   English

使用 jackson 反序列化 json 响应时出现 IndexOutOfBoundException

[英]IndexOutOfBoundException while Deserializing a json response using jackson

I am trying to deserialize a json response from another API but i keep on getting indexoutofboundException.我正在尝试反序列化来自另一个 API 的 json 响应,但我不断收到 indexoutofboundException。 Below is my json response that i am trying to deserialize -下面是我试图反序列化的 json 响应 -

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

For deserializing i am using below implementation -对于反序列化,我使用以下实现 -

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 looks like this - 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 looks like this - 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;


}

Basically my implementation works when the json response is like this -基本上,当 json 响应如下时,我的实现就可以工作了-

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

but gives me indexOutofBoundException when data array inside the response is empty -但是当响应中的数据数组为空时给我 indexOutofBoundException -

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

I guess maybe data that post request return is wrong.我想也许发布请求返回的数据是错误的。 I do a test with string as your said.如您所说,我用字符串进行了测试。 it is work.这是工作。

    @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))
    }

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

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