Spring Boot Java17中Jackson反序列化Predictions类报错求助
解决Jackson反序列化MismatchedInputException问题
核心问题分析
报错提示无法从字符串值'0.97982854'构造Predictions实例,说明Jackson反序列化时,在预期Predictions对象的位置读取到了字符串类型值,本质是实体类定义与JSON响应结构不匹配,或反序列化配置缺失。
排查与修复步骤
1. 确认JSON响应结构
先打印接口返回的原始JSON字符串,验证predictions数组的结构是否符合预期。正确结构应类似:
{ "predictions": [ {"probability": 0.97982854, "tagName": "sample-tag"} ] }
如果实际返回的predictions是字符串数组(如["0.97982854", "tag1"]),则需直接调整实体类字段定义。
2. 修正Predictions实体类
确保实体类满足Jackson反序列化要求:
- 必须包含无参构造方法(Jackson默认依赖),可通过Lombok的
@NoArgsConstructor快速生成 - 字段类型与JSON键严格匹配:
probability用Double/double,tagName用String - 字段名与JSON键不一致时,用
@JsonProperty指定映射关系
示例正确实现:
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Predictions { @JsonProperty("probability") private Double probability; @JsonProperty("tagName") private String tagName; }
3. 检查CompuVisionResponse实体类
确保外层响应类的predictions字段为List<Predictions>类型:
import lombok.Data; import java.util.List; @Data public class CompuVisionResponse { private List<Predictions> predictions; }
4. 调整反序列化方式(可选)
若直接用ResponseEntity<CompuVisionResponse>报错,可先获取字符串响应再手动反序列化,便于定位问题:
RestTemplate restTemplate = new RestTemplate(); String rawResponse = restTemplate.getForObject("your-api-url", String.class); System.out.println(rawResponse); // 确认响应内容 // 手动反序列化 ObjectMapper objectMapper = new ObjectMapper(); CompuVisionResponse response = objectMapper.readValue(rawResponse, CompuVisionResponse.class);
5. 处理字符串类型的数值字段
如果API返回的probability是字符串格式(如"probability": "0.97982854"),需开启Jackson的字符串转数值支持:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.ACCEPT_STRING_AS_NUMBER); // 用该ObjectMapper完成反序列化
或在Predictions的probability字段上添加注解:
@JsonFormat(shape = JsonFormat.Shape.STRING) private Double probability;
验证
修复后重新调用接口,检查是否能正常读取predictions数组中的probability和tagName值,确认数据可正确存储。
内容的提问来源于stack exchange,提问作者Alejandro Huamaní Reátegui
相关产品推荐
相关产品推荐

