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

Spring Boot默认配置下如何让Jackson转义\n、\t等字符

问题分析与解决办法

为什么会出现未转义的控制字符?

你遇到的核心问题分两种场景:

  1. 手动拼接JSON字符串返回:如果你的/demo接口是直接返回手动拼接的字符串(比如return "{\"title\":\"Example of \n JSON\"}";),Spring Boot会直接输出这个原始字符串,不会经过Jackson的序列化流程。此时字符串里的\n是字面量换行符,没有被转义为\\n,导致生成的JSON不符合RFC规范。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:19:59