你好!
格式化的 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)}} 中的 {{(seq m)}} 在 {{write-object}} 中应该是 {{(seq x)}}。