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

Java JSON序列化日期转义重复问题:如何实现12/28格式输出

解决Jackson序列化日期字符串时出现12\/28的问题

你遇到的问题核心是重复转义或者Jackson的默认配置导致斜杠被额外处理了,我来给你梳理清楚原因和解决办法:

问题根源

你当前的处理流程是先用StringEscapeUtils.escapeJson处理12/28,它会把/转成\/;之后Jackson序列化时,默认又会对字符串中的/执行转义(这是Jackson的默认行为,虽然JSON规范允许不转义/)。两次处理叠加,就导致最终输出变成了12\/28。其实你完全不需要提前用StringEscapeUtils做转义,直接配置Jackson就能得到想要的结果。

推荐解决方案:关闭Jackson的斜杠转义特性

直接配置Jackson的ObjectMapper,禁用ESCAPE_SLASHES特性,这样序列化时就不会转义/了。代码示例如下:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DateSerializer {
    public static void main(String[] args) throws Exception {
        // 定义你的数据类
        class ExpiryData {
            private String expiryDate;

            public String getExpiryDate() { return expiryDate; }
            public void setExpiryDate(String expiryDate) { this.expiryDate = expiryDate; }
        }

        ExpiryData data = new ExpiryData();
        data.setExpiryDate("12/28");

        ObjectMapper mapper = new ObjectMapper();
        // 关键:禁用斜杠转义
        mapper.configure(JsonGenerator.Feature.ESCAPE_SLASHES, false);

        String jsonOutput = mapper.writeValueAsString(data);
        System.out.println(jsonOutput); // 输出:{"expiryDate":"12/28"}
    }
}

备选方案(不推荐):如果必须保留StringEscapeUtils处理

如果你因为某些业务限制一定要先用StringEscapeUtils转义,那可以通过@JsonRawValue注解让Jackson直接输出原始字符串内容,避免二次转义。但这种方式要注意,若字符串包含其他特殊字符,可能破坏JSON格式,所以仅作为备选:

import com.fasterxml.jackson.annotation.JsonRawValue;
import org.apache.commons.text.StringEscapeUtils;

class ExpiryData {
    @JsonRawValue
    private String expiryDate;

    public String getExpiryDate() { return expiryDate; }
    public void setExpiryDate(String expiryDate) { this.expiryDate = expiryDate; }
}

// 使用示例
public class DateSerializer {
    public static void main(String[] args) throws Exception {
        ExpiryData data = new ExpiryData();
        // 先转义
        data.setExpiryDate(StringEscapeUtils.escapeJson("12/28"));

        ObjectMapper mapper = new ObjectMapper();
        String jsonOutput = mapper.writeValueAsString(data);
        System.out.println(jsonOutput); // 输出:{"expiryDate":"12/28"}
    }
}

补充说明:JSON规范中/的转义是可选操作,关闭Jackson的转义特性完全符合规范,不会影响JSON的解析兼容性。

内容的提问来源于stack exchange,提问作者Smart B0y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:35:24