无法反序列化my';中的START#u数组令牌外的java.util.LinkedHashMap实例;数据请求';dto
我有一个高度嵌套的api响应:无法反序列化my';中的START#u数组令牌外的java.util.LinkedHashMap实例;数据请求';dto,java,jackson,lombok,rest-assured,Java,Jackson,Lombok,Rest Assured,我有一个高度嵌套的api响应: { "dataRequests": [ { "status": "success", "title": "token", "values": { "limit": 1, "offset": 0,
{
"dataRequests": [
{
"status": "success",
"title": "token",
"values": {
"limit": 1,
"offset": 0,
"count": 1,
"total": 1,
"elements": [
{
"type": "DOMAIN",
"permission": "default",
"properties": [
{
"name": "property:id",
"value": 390
},
{
"name": "setting:crawler:token",
"value": "here's a token"
}
],
"filters": []
}
]
}
}
]
}
我尝试使用许多包装器来解析它。因为当我想用令牌获取字段“value”时,从一个dataRequest dto返回“null”
但在编译时遇到了一个问题:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize
instance of java.util.LinkedHashMap out of START_ARRAY token
at [Source: {"dataRequests":[{"status":"success","title":"token","values":
{"limit":1,"offset":0,"count":1,"total":1,"elements":
[{"type":"DOMAIN","permission":"default","properties":[{"name":"property:id","value":390},
{"name":"setting:crawler:token","value":"here's a token"}],"filters":[]}]}}]}; line: 1, column:
17] (through reference chain: com.rest.dto.ProjectTokenDto["dataRequests"])
我的DTO:
ProjectTokenDto:
@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProjectTokenDto {
private Map<String, ValuesDto> dataRequests;
}
private List<DataRequestDto> dataRequests;
然后我尝试用非最佳方式解析这棵树,但我不明白如何更容易地解析它?以及上面的例外情况:
ProjectTokenDto wrapper = graphQLSteps.postProjectToken(id);
Map<String, ValuesDto> values = wrapper.getDataRequests();
Map<String, List<ElementsDto>> elements = new HashMap<>();
Map<String, List<PropertiesDto>> properties = new HashMap<>();
for (Map.Entry<String, ValuesDto> entry : values.entrySet()) {
if (entry.getKey().equals("values")) {
elements.put(entry.getKey(), (List<ElementsDto>) entry.getValue().getValues());
}
}
for (Map.Entry<String, List<ElementsDto>> entry : elements.entrySet()) {
if (entry.getKey().equals("elements")) {
properties.put(entry.getKey(), (List<PropertiesDto>) entry.getValue().get(0).getElements());
}
}
for (Map.Entry<String, List<PropertiesDto>> entry : properties.entrySet()) {
if (!entry.getValue().get(0).getValue().equals(Long.toString(id))) {
token = entry.getValue().get(0).getValue();
}
}
试图手动忽略它,将JsonIgnoreProperties更改为
@JsonIgnoreProperties({"limit", "offset", "count", "total", "status", "title"})
在ValuesTo中,但最终有相同的异常我通过更改dto的值来修复它: ProjectTokenDto:
@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProjectTokenDto {
private Map<String, ValuesDto> dataRequests;
}
private List<DataRequestDto> dataRequests;
值到:
private List<ElementsDto> elements;
dataRequests
是一个列表,而不是一个map@OneCricketeer谢谢,但是在从私有映射数据请求更改之后;私人列表数据请求;我有一个新问题。写在“更新”中你没有限制字段,所以我不确定。但是您的值dto需要一个名为elements的列表字段
private List<DataRequestDto> dataRequests;
private ValuesDto values;
private List<ElementsDto> elements;
private List<PropertiesDto> properties;
private String name;
private String value;