Retrofit调用报Jackson MismatchedInputException无法反序列化response异常
问题根因
报错的核心原因是接口返回的JSON为数组格式(以[开头),但你在Retrofit接口中定义的返回值是单个ReferralResponse对象类型,Jackson反序列化时类型不匹配触发异常。
解决方案
1. 修改Retrofit接口声明的返回类型
将你定义的接口返回值从Call<ReferralResponse>调整为Call<List<ReferralResponse>>,匹配接口返回的数组结构。示例:
// 原错误写法 // Call<ReferralResponse> getReferral(@Header("Authorization") String token); // 修正后写法 Call<List<ReferralResponse>> getReferral(@Header("Authorization") String token);
2. 配置Jackson忽略未知字段(避免多余字段报错)
你不需要为所有返回字段生成实体类,只需在ReferralResponse类上添加@JsonIgnoreProperties(ignoreUnknown = true)注解,Jackson会自动跳过你没定义的字段,你现有的@JsonAnySetter注解也会把未定义的字段存入additionalProperties map中,不会触发反序列化失败:
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({/* 省略原有字段列表 */}) @JsonIgnoreProperties(ignoreUnknown = true) // 新增这行注解 @Generated("jsonschema2pojo") public class ReferralResponse { // 原有类内容保持不变 }
如果是全局配置Retrofit的Jackson转换器,也可以直接给ObjectMapper设置该属性:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(JacksonConverterFactory.create(objectMapper)) .build();
3. 调整业务代码获取id
反序列化后得到的是ReferralResponse列表,取对应元素的id转换即可,注意增加判空逻辑避免空指针:
Response<List<ReferralResponse>> referralResponseResponse = call1.getReferral(token).execute(); if (referralResponseResponse.isSuccessful() && referralResponseResponse.body() != null) { List<ReferralResponse> responseList = referralResponseResponse.body(); if (!responseList.isEmpty()) { // 确认你要取的是列表中第几个元素的id,这里默认取第一个 Object idObj = responseList.get(0).getId(); // 安全转换为int,避免类型转换异常 int id = idObj instanceof Number ? ((Number) idObj).intValue() : Integer.parseInt(idObj.toString()); System.out.println("Int: " + id); } }
内容的提问来源于stack exchange,提问作者fearghal O reilly
相关产品推荐
相关产品推荐

