Scala中配置json4s的writePretty匹配pre-commit-hooks JSON格式
在Scala中配置json4s的writePretty匹配pre-commit-hooks的JSON格式要求
问题背景
使用Scala的org.json4s结合Jackson时,调用Serialization.writePretty生成的JSON格式与pre-commit-hooks的pretty-format-json规则不匹配,需要满足三个要求:
- 冒号前无空格(如
"name": "John"而非"name" : "John") - 空数组无空格(如
"misc": []而非"misc" : [ ]) - 非空数组每个元素单独占一行
无需完全重写PrettyPrinter的优雅解决方案
可以通过自定义DefaultPrettyPrinter的子类+配置参数实现,不用依赖字符串替换这种易出错的方式:
实现代码
import org.json4s.jackson.JsonMethods import org.json4s.jackson.Serialization import org.json4s.{DefaultIndenter, DefaultPrettyPrinter} // 自定义PrettyPrinter,仅覆盖空数组的输出格式 class CustomJsonPrettyPrinter extends DefaultPrettyPrinter { override val emptyArray: String = "[]" } // 配置并使用自定义打印机 val prettyPrinter = new CustomJsonPrettyPrinter() // 设置对象键值对的缩进规则:2个空格缩进,换行 .withObjectIndenter(new DefaultIndenter(" ", "\n")) // 设置数组元素的缩进规则:2个空格缩进,换行 .withArrayIndenter(new DefaultIndenter(" ", "\n")) // 设置键和值之间的分隔符:冒号前无空格,后有空格 .withObjectFieldValueSeparator(": ") // 将自定义打印机设置为Jackson的默认格式化器 JsonMethods.mapper.setDefaultPrettyPrinter(prettyPrinter) // 生成符合要求的格式化JSON val formattedJson = Serialization.writePretty(jsonSchema)
配置说明
- 冒号格式:通过
withObjectFieldValueSeparator(": ")将键值分隔符从默认的" : "改为": ",解决冒号前有空格的问题 - 空数组格式:通过继承
DefaultPrettyPrinter并覆盖emptyArray字段为"[]",替代默认的"[ ]" - 非空数组换行:通过
withArrayIndenter配置DefaultIndenter(" ", "\n"),让数组每个元素单独换行并缩进
对比原方案的优势
原方案使用字符串replace操作存在风险:如果JSON的字符串值中包含" : "或[ ],会被错误替换;而自定义打印机的方式是从序列化底层控制格式,更安全可靠。
内容的提问来源于stack exchange,提问作者Mickaël N
相关产品推荐
相关产品推荐

