如何处理Spring Rest服务调用返回多个类型的响应

时间:2018-08-13 17:39:50

标签: java json spring rest jackson

我试图在春季通过rest调用来调用第三方api。目前,我正在使用postforobject。我将请求类转换为字符串并为对象调用post.And响应被视为字符串,然后将其转换为类。用以下参数定义了类

Class responseDto {
 private Arraylist < Response > response;
 getResponse();
 setResponse();
}

Response {
  String code;
  String trid;
  Getters();
  Setters();
}

我正在使用Jackson依赖项进行序列化和反序列化。 此类对于以下响应正常运行

{
"response":[
   {
     "code":"100",
     "trid":"123"
   }
 ]
}

但是在错误情况下,其余的将返回一个名称为“ response”的json类,如下所示

{
 "response":{
  "code":"700",
  "trid":"123"
 }
}

并且我用某个json映射异常定义的类的反序列化失败(com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT令牌中反序列化java.util.ArrayList的实例)。那么如何解决这个问题在Java spring中。

1 个答案:

答案 0 :(得分:0)

解决方案1:使用@JsonFormat(> 2.6版本)

只需使用@JsonFormat标记为

import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Feature;

public class ResponseDto {

    @JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<Response> response;

    public List<Response> getResponse() {
        return response;
    }

    public void setResponse(List<Response> response) {
        this.response = response;
    }
}

解决方案2:设置反序列化功能

public static void main(String[] args) throws IOException {

    ObjectMapper mapper = new ObjectMapper();

    // global setting, can be overridden using @JsonFormat in beans
    // when using @JsonFormat on fields, then this is not needed 
    mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

    ResponseDto dto =  mapper.readValue(stringResponse, ResponseDto.class);
}

现在json中包含单个对象,单个对象数组,多个对象数组的response节点将被成功解析为Response对象的列表。