您好!
格式化的 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))
"Elapsed time: 219.33 msecs"
clojure.data.json=> (time (do (with-out-str (clojure.data.json/pprint-json data)) nil))
"Elapsed time: 25271.549 msecs"
`
提出的一种增强方法非常简单:新键和数组元素应有缩进,但不要试图将值适应当前行宽限制。对人类而言,这样格式化的 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)) "Elapsed time: 250.18 msecs"
我还修复了一个小错误:{{(seq m)}} 在 {{write-object}} 中应该是 {{(seq x)}}。