如何处理提交至List的空JSON{}?Jackson反序列化报错无法捕获
处理空JSON对象{}反序列化为List的Jackson异常问题
错误原因
你遇到的MismatchedInputException本质是JSON结构与目标Java类型不匹配:Jackson要求List类型对应的JSON结构是数组[],而你提交的是空对象{},两者无法直接转换,因此抛出反序列化错误。
解决方案
1. 自定义Jackson反序列化器(全局/局部)
编写自定义反序列化器,让Jackson遇到空对象时自动转为空List:
public class EmptyObjectToEmptyListDeserializer extends JsonDeserializer<List<?>> { private final JsonDeserializer<List<?>> defaultDeserializer; public EmptyObjectToEmptyListDeserializer(JsonDeserializer<List<?>> defaultDeserializer) { this.defaultDeserializer = defaultDeserializer; } @Override public List<?> deserialize(JsonParser parser, DeserializationContext context) throws IOException { JsonToken currentToken = parser.getCurrentToken(); // 检测到空对象时返回空List if (currentToken == JsonToken.START_OBJECT) { parser.skipChildren(); // 跳过空对象的所有子节点 return Collections.emptyList(); } // 其他情况使用默认反序列化逻辑 return defaultDeserializer.deserialize(parser, context); } }
- 全局生效(Spring环境):注册到ObjectMapper
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); SimpleModule customModule = new SimpleModule(); // 获取List的默认反序列化器,包装后注册 JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, Object.class); JsonDeserializer<List<?>> defaultDeserializer = mapper.getDeserializationConfig() .findRootValueDeserializer(listType); customModule.addDeserializer(List.class, new EmptyObjectToEmptyListDeserializer(defaultDeserializer)); mapper.registerModule(customModule); return mapper; }
- 局部生效:在特定List字段上标注
@JsonDeserialize
@JsonDeserialize(using = EmptyObjectToEmptyListDeserializer.class) private List<YourBusinessEntity> targetList;
2. 提前校验请求体(Controller层拦截)
在接收请求时先判断请求体结构,主动处理空对象:
@PostMapping("/your-api") public ResponseEntity<?> processListRequest(@RequestBody String rawRequestBody) throws IOException { ObjectMapper mapper = new ObjectMapper(); JsonNode requestNode = mapper.readTree(rawRequestBody); // 识别空对象并返回空List if (requestNode.isObject() && requestNode.size() == 0) { return ResponseEntity.ok(Collections.emptyList()); } // 正常解析为List List<YourBusinessEntity> dataList = mapper.readValue(rawRequestBody, new TypeReference<List<YourBusinessEntity>>() {}); // 业务逻辑处理... return ResponseEntity.ok(dataList); }
3. 前端请求修正(最优方案)
从根源解决:要求前端在需要传递空List时,发送JSON数组[]而非空对象{},完全符合Jackson的默认解析规则,避免额外的后端处理。
内容的提问来源于stack exchange,提问作者BDehylz Lima
相关产品推荐
相关产品推荐

