You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理提交至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:03:00