当前位置: 首页 > 知识库问答 >
问题:

如何使用Springboot RestTemplate从REST响应中反序列化原始数组数组

孙熠彤
2023-03-14

我使用SpringBoot RestTemplate来消费REST API。响应体由数组的数组组成,每个嵌套数组都有一个键值对,如下所示:

[
    ["michael",0.9227975606918335],
    ["frank",0.888996958732605],
    ["christian",0.887883722782135]
]

当然,这种JSON结构并不理想,但是我不得不使用它。我想将这个响应反序列化为一个只有一个字段(二维数组)的Java对象。

API是这样调用的:

GetResponse response = restTemplate.getForObject(url, GetResponse.class);

Java类结构如下所示(全部用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`)

知道所需的类结构是什么样子的吗?我是否在任何地方缺少Jackson注释?请注意,我确实得到了响应,所以问题显然是反序列化。谢谢。

共有1个答案

罗飞宇
2023-03-14

您应该将您的响应映射到< code>KeyValuePair[]。class而不是< code>GetResponse.class并添加< code > @ JSON format(shape = JSON format。Shape.ARRAY)对KeyValuePair类的注释。

类似这样的事情应该会起作用:

键值对类:

@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);
 类似资料:
  • 问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…

  • 我收到来自第3方服务提供商的JSON响应,其中包含一系列对象。当我尝试使用Jackson api反序列化JSON时。我收到以下异常 我的回答是 我的POJO课是这样的 我正在尝试使用以下代码反序列化JSON 如果我试着去做 它在BEGIN_对象本身失败。 如何使用数组读取和反序列化JSON。我应该编写自己的反序列化器吗? 编辑如果我使用JSON字符串而不是流,那么我就能够取回所有Java对象。但为

  • 问题内容: 在杰克逊的数据绑定的文档表明,杰克逊支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 问题内容: 我有一些从Web服务返回的JSON数据。JSON是顶级数组: 使用make 可以对数组中包含的数据进行反序列化,但是,我无法让Serde对顶级数组进行反序列化。 我是否缺少某些内容,还是Serde不能对顶级数组进行反序列化? 问题答案: 您可以使用:

  • 问题内容: 支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?