SpringBoot使用Jackson序列化POJO输出JSON时去除键名与冒号间空格
解决方案
不需要编写自定义序列化器,你遇到的格式问题是Jackson默认pretty printer的默认分隔符规则导致的,Jackson本身提供了原生配置可以直接修改键值分隔符样式,几行代码就能实现需求,不需要改动现有POJO结构。
具体实现步骤
你当前直接调用writerWithDefaultPrettyPrinter()使用的是Jackson内置的默认格式化规则,该规则默认给对象字段名和冒号之间加了1个空格,只要自定义分隔符配置,把对象字段和值之间的分隔符从默认的:(键名后、冒号前带空格)改成: (键名直接接冒号,冒号后保留1个空格)即可。
SpringBoot默认集成的Jackson版本(2.9及以上)都支持这个配置,不需要引入额外依赖,修改后的方法代码如下:
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.core.util.Separators; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.nio.file.Paths; public class GoogleJSONAuthWriter { public void writeGoogleAuthPropertiesToJSON(GoogleAuthProperties googleAuthProperties) throws IOException { ObjectMapper mapper = new ObjectMapper(); // 自定义JSON格式化规则 DefaultPrettyPrinter customPrettyPrinter = new DefaultPrettyPrinter(); // 配置键值分隔符:键名后直接拼接冒号,冒号与值之间保留单个空格 Separators separators = Separators.createDefaultInstance() .withObjectFieldValueSeparator(": "); customPrettyPrinter.withSeparators(separators); // 用自定义格式化器输出JSON文件 mapper.writer(customPrettyPrinter) .writeValue(Paths.get("key.json").toFile(), googleAuthProperties); } }
效果说明
- 输出的JSON完全匹配你需要的格式,嵌套对象、数组的缩进规则和之前默认格式化的效果完全一致,仅调整了冒号前后的空格
- 不需要修改
GoogleAuthProperties类的任何字段、注解,原有序列化逻辑完全兼容 - 如果你需要全局复用这个格式规则,可以把自定义的
customPrettyPrinter设置为ObjectMapper的默认prettyPrinter,后续所有格式化输出都会自动应用这个规则:mapper.setDefaultPrettyPrinter(customPrettyPrinter); // 之后直接调用writerWithDefaultPrettyPrinter()就会用自定义规则 mapper.writerWithDefaultPrettyPrinter().writeValue(/* 输出路径 */, googleAuthProperties);
内容的提问来源于stack exchange,提问作者I2obiN
相关产品推荐
相关产品推荐

