【发布时间】: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