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
相关产品推荐
相关产品推荐

