嗨!
格式化的 JSON 对于人类使用非常有用,例如在调试或探索 JSON API 时。data.json 提供了一种名为 {{pprint-json}} 的格式化方式。问题是,{{pprint-json}} 非常慢,因为它试图将所有内容适应到某个行宽限制。实际上,使用 {{pprint-json}} 而不是 {{write-str}} 会多花费 20-100 倍的时间,到了无法在生产环境中使用的时候。
`
clojure.data.json=> (def data (read-string (slurp "sample.edn")))
'clojure.data.json/data
clojure.data.json=> (count data)
4613
clojure.data.json=> (time (do (clojure.data.json/write-str data) nil))
"执行时间:219.33 毫秒"
clojure.data.json=> (time (do (with-out-str (clojure.data.json/pprint-json data)) nil))
"执行时间:25271.549 毫秒"
`
建议的增强功能非常简单:缩进新的键和数组元素,但不要尝试将值适应到行宽限制。对人类来说,这种方式的格式化的 JSON 仍然易于消费,结构明显。唯一的缺点是一些行可能会变得非常长。
在附带的补丁中,我修改了 {{write-array}} 和 {{write-object}},为 {{write}} 添加了新的 {{:indent}} 选项。要打印缩进 JSON,现在可以写成:{{(write-str data :indent true)}}
当然有一些性能损失,但相对较小
clojure.data.json=> (time (do (clojure.data.json/write-str data :indent true) nil)) "执行时间:250.18 毫秒"
我还修复了一个小错误:{{(seq m)}} 东西在 {{write-object}} 中应该是 {{(seq x)}}。