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

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)

配置说明

  1. 冒号格式:通过withObjectFieldValueSeparator(": ")将键值分隔符从默认的" : "改为": ",解决冒号前有空格的问题
  2. 空数组格式:通过继承DefaultPrettyPrinter并覆盖emptyArray字段为"[]",替代默认的"[ ]"
  3. 非空数组换行:通过withArrayIndenter配置DefaultIndenter(" ", "\n"),让数组每个元素单独换行并缩进

对比原方案的优势

原方案使用字符串replace操作存在风险:如果JSON的字符串值中包含" : "或[ ],会被错误替换;而自定义打印机的方式是从序列化底层控制格式,更安全可靠。

内容的提问来源于stack exchange,提问作者Mickaël N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:16:02