如何使用 Springboot RestTemplate 从 REST 响应反序列化原始数组数组
How to de-serialize a raw array of arrays from REST response using Springboot RestTemplate
我正在使用 SpringBoot RestTemplate 来使用 REST API。响应主体由一个数组组成,每个嵌套数组都有一个键值对,类似于:
[
["michael",0.9227975606918335],
["frank",0.888996958732605],
["christian",0.887883722782135]
]
这个 JSON 结构当然不理想,但我必须使用它。我想将此响应反序列化为具有一个字段(二维数组)的 Java 对象。
API是这样调用的:
GetResponse response = restTemplate.getForObject(url, GetResponse.class);
Javaclass结构看起来像这样(全部用Lombok的@NoArgsConstructor、@AllArgsConstructor、@Getter、@Setter注释):
public class GetResponse {
@JsonProperty
private NamesArray[] data;
}
public class NamesArray {
@JsonProperty
private KeyValuePair[] data;
}
public class KeyValuePair {
@JsonProperty
private String key;
@JsonProperty
private float rating;
}
这应该可行,但我一直收到此错误:
org.springframework.web.client.RestClientException: Error while extracting response for type
[class com.mypackage.Client$GetResponse] and content type [application/json]; nested exception is
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot
deserialize value of type `com.mypackage.Client$GetResponse` from Array value (token `JsonToken.START_ARRAY`);
nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot deserialize value of type `com.mypackage.Client$GetResponsesponse` from Array value (token `JsonToken.START_ARRAY`)
知道所需的 class 结构是什么样的吗?我在任何地方都缺少杰克逊注释吗?请注意,我确实收到了回复,所以问题显然出在反序列化上。
谢谢
您应该将您的响应映射到 KeyValuePair[].class
而不是 GetResponse.class
并将 @JsonFormat(shape= JsonFormat.Shape.ARRAY)
注释添加到 KeyValuePair class.
像这样的东西应该可以工作:
键值对class:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonFormat(shape= JsonFormat.Shape.ARRAY)
public static class KeyValuePair {
private String key;
private float rating;
}
响应:
KeyValuePair[] response = restTemplate.getForObject(url, KeyValuePair[].class);
我正在使用 SpringBoot RestTemplate 来使用 REST API。响应主体由一个数组组成,每个嵌套数组都有一个键值对,类似于:
[
["michael",0.9227975606918335],
["frank",0.888996958732605],
["christian",0.887883722782135]
]
这个 JSON 结构当然不理想,但我必须使用它。我想将此响应反序列化为具有一个字段(二维数组)的 Java 对象。
API是这样调用的:
GetResponse response = restTemplate.getForObject(url, GetResponse.class);
Javaclass结构看起来像这样(全部用Lombok的@NoArgsConstructor、@AllArgsConstructor、@Getter、@Setter注释):
public class GetResponse {
@JsonProperty
private NamesArray[] data;
}
public class NamesArray {
@JsonProperty
private KeyValuePair[] data;
}
public class KeyValuePair {
@JsonProperty
private String key;
@JsonProperty
private float rating;
}
这应该可行,但我一直收到此错误:
org.springframework.web.client.RestClientException: Error while extracting response for type
[class com.mypackage.Client$GetResponse] and content type [application/json]; nested exception is
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot
deserialize value of type `com.mypackage.Client$GetResponse` from Array value (token `JsonToken.START_ARRAY`);
nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot deserialize value of type `com.mypackage.Client$GetResponsesponse` from Array value (token `JsonToken.START_ARRAY`)
知道所需的 class 结构是什么样的吗?我在任何地方都缺少杰克逊注释吗?请注意,我确实收到了回复,所以问题显然出在反序列化上。 谢谢
您应该将您的响应映射到 KeyValuePair[].class
而不是 GetResponse.class
并将 @JsonFormat(shape= JsonFormat.Shape.ARRAY)
注释添加到 KeyValuePair class.
像这样的东西应该可以工作:
键值对class:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonFormat(shape= JsonFormat.Shape.ARRAY)
public static class KeyValuePair {
private String key;
private float rating;
}
响应:
KeyValuePair[] response = restTemplate.getForObject(url, KeyValuePair[].class);