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

如何捕获并处理用户提交的非法JSON数据(含未引号字符错误)

解决Jackson解析JSON时的“Illegal unquoted character”异常捕获问题

这个问题我之前也碰到过,Jackson默认的严格JSON校验会对未转义的特殊字符(比如未加引号的换行、制表符,或者非法的控制字符)抛出这个错误。结合你的实体类注解配置,给你两种核心解决方案:

方案一:全局配置Jackson,容忍非法字符(适合兼容不规范JSON场景)

如果你的业务允许接收一些不严格符合JSON规范的数据,可以通过配置ObjectMapper来放宽校验规则,让Jackson忽略未转义的控制字符。

创建一个Jackson配置类:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        
        // 关键配置:允许未转义的控制字符(解决"Illegal unquoted character"错误)
        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        
        // 保留你原有的实体类注解对应的配置
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        
        return mapper;
    }
}

注意:这个方案会降低JSON校验的严格性,如果你需要严格遵循JSON规范,不建议使用。

方案二:捕获解析异常,返回友好提示(适合严格校验场景)

如果要保持严格的JSON校验,同时给用户明确的错误提示,可以通过局部Controller异常捕获或者全局异常处理来拦截HttpMessageNotReadableException(Jackson解析失败时会抛出这个上层异常,根因是JsonParseException)。

方式1:Controller局部捕获

@RestController
@RequestMapping("/data")
public class DataSubmitController {

    @Autowired
    private YourDataRepository repository;

    @PostMapping("/submit")
    public ResponseEntity<String> submitData(@RequestBody YourEntity entity) {
        try {
            // 正常存储逻辑
            repository.save(entity);
            return ResponseEntity.ok("数据提交成功");
        } catch (HttpMessageNotReadableException e) {
            Throwable rootCause = e.getRootCause();
            // 判断是否是目标异常
            if (rootCause instanceof JsonParseException && 
                rootCause.getMessage().contains("Illegal unquoted character")) {
                return ResponseEntity.badRequest()
                        .body("错误:提交的JSON包含未转义的非法字符,请检查并修正(例如换行、特殊符号需用引号包裹或正确转义)");
            }
            // 处理其他JSON解析错误
            return ResponseEntity.badRequest().body("JSON格式错误:" + e.getMessage());
        }
    }
}

方式2:全局异常处理(推荐,统一管理所有接口的解析错误)

创建全局异常处理器,所有Controller的JSON解析错误都会被拦截:

@RestControllerAdvice
public class GlobalJsonExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<String> handleJsonParseError(HttpMessageNotReadableException e) {
        Throwable rootCause = e.getRootCause();
        if (rootCause instanceof JsonParseException) {
            String errorMsg = rootCause.getMessage();
            if (errorMsg.contains("Illegal unquoted character")) {
                return ResponseEntity.badRequest()
                        .body("错误:提交的JSON包含未转义的非法字符,请检查并修正(例如换行、特殊符号需正确转义)");
            }
            return ResponseEntity.badRequest().body("JSON格式解析错误:" + errorMsg);
        }
        return ResponseEntity.badRequest().body("请求数据格式错误,请检查JSON格式");
    }
}

补充说明

出现“Illegal unquoted character”错误的常见场景:

  • JSON字符串中包含未转义的换行符(\n)、制表符(\t)
  • 特殊字符(比如\、')未用双引号包裹或未正确转义
  • 存在非法的控制字符(如ASCII控制字符)

根据你的业务需求选择合适的方案即可,严格校验的话优先用异常捕获的方式,能给用户更清晰的反馈。

内容的提问来源于stack exchange,提问作者Vipul Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:09:29