如何捕获并处理用户提交的非法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
相关产品推荐
相关产品推荐

