如何使用 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);