Spring Boot默认配置下如何让Jackson转义\n、\t等字符
问题分析与解决办法
为什么会出现未转义的控制字符?
你遇到的核心问题分两种场景:
- 手动拼接JSON字符串返回:如果你的
/demo接口是直接返回手动拼接的字符串(比如return "{\"title\":\"Example of \n JSON\"}";),Spring Boot会直接输出这个原始字符串,不会经过Jackson的序列化流程。此时字符串里的\n是字面量换行符,没有被转义为\\n,导致生成的JSON不符合RFC规范。 - Jackson配置被修改:如果是返回POJO对象但仍出现该问题,大概率是自定义Jackson配置时关闭了控制字符转义特性(比如
JsonGenerator.Feature.ESCAPE_CONTROL_CHARS被禁用),默认情况下Jackson会自动转义\n、\t这类控制字符。
为什么Jackson自己无法解析?
JSON规范明确要求字符串中的控制字符(如换行、制表符)必须转义。你生成的JSON里包含未转义的\n(字面量换行),属于非法JSON,Jackson的解析器严格遵循规范,自然会抛出JsonParseException。
更合适的解决方式
1. 优先返回POJO对象而非手动拼接JSON
这是Spring Boot接口开发的标准实践,Jackson会自动处理转义:
// 定义响应实体类 public class DemoResponse { private String title; // 构造方法、getter、setter public DemoResponse(String title) { this.title = title; } public String getTitle() { return title; } } // 接口实现 @GetMapping("/demo") public DemoResponse demo() { return new DemoResponse("Example of \n JSON"); }
此时返回的JSON会被正确转义为:{"title":"Example of \n JSON"}(实际输出为{"title":"Example of \\n JSON"},客户端解析后会还原为换行符)。
2. 若必须返回字符串,通过Jackson序列化生成
如果业务上需要返回字符串形式的JSON,不要手动拼接,而是用ObjectMapper序列化对象:
@Autowired private ObjectMapper objectMapper; @GetMapping("/demo") public String demo() throws JsonProcessingException { DemoResponse response = new DemoResponse("Example of \n JSON"); return objectMapper.writeValueAsString(response); }
这样生成的字符串会自动完成控制字符转义,符合JSON规范。
3. 恢复Jackson默认转义配置
如果之前自定义了Jackson配置,检查是否禁用了控制字符转义,确保开启该特性:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 确保开启控制字符转义(默认开启,若被手动关闭则需显式启用) objectMapper.getFactory().enable(JsonGenerator.Feature.ESCAPE_CONTROL_CHARS); return objectMapper; } }
内容的提问来源于stack exchange,提问作者lbodevan
相关产品推荐
相关产品推荐

