
jackson 默认启用缩进时会在 key : value 中插入空格,可通过自定义 prettyprinter 覆盖字段分隔符行为,将 ": " 替换为 ":",从而实现紧凑、标准的 json 键值格式。
jackson 默认启用缩进时会在 key : value 中插入空格,可通过自定义 prettyprinter 覆盖字段分隔符行为,将 ": " 替换为 ":",从而实现紧凑、标准的 json 键值格式。
Jackson 的 SerializationFeature.INDENT_OUTPUT 在美化输出时,默认使用 ": "(冒号后带一个空格)作为键值分隔符。若需符合常见 JSON 规范(如 RFC 8259 推荐格式)或对接严格解析器,应去除该空格,得到 "key": value 而非 "key" : value。
最直接、无侵入的解决方案是继承 DefaultPrettyPrinter 并重写 writeObjectFieldValueSeparator() 方法:
public class CompactPrettyPrinter extends DefaultPrettyPrinter {
@Override
public DefaultPrettyPrinter createInstance() {
return new CompactPrettyPrinter();
}
@Override
public void writeObjectFieldValueSeparator(JsonGenerator jg) throws IOException {
jg.writeRaw(':'); // 注意:不带空格
}
}
使用方式如下:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String json = mapper.writer(new CompactPrettyPrinter())
.writeValueAsString(Map.of("id", 2, "name", "theUser"));
输出结果为:
{
"id": 2,
"name": "theUser"
}
✅ 关键说明:
- writeRaw(':') 直接输出冒号字符,不附加空格;Jackson 自动在冒号前后处理必要的空白(如缩进),因此无需手动添加空格;
- createInstance() 必须重写并返回新实例,确保在嵌套对象/数组中仍保持一致行为;
- 此方案不影响其他格式控制(如缩进宽度、换行策略),仅精准定制键值分隔符;
- 不推荐通过正则替换 JSON 字符串(易出错且破坏结构),也无需编写完整自定义序列化器。
⚠️ 注意:若同时使用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 或其他特性,请确保 CompactPrettyPrinter 与之兼容——它仅修改分隔符,不干扰数据类型序列化逻辑。










