嗨!
格式化的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}}选项。现在可以用{{(write-str data :indent true)}}来打印缩进json。
当然,这会有一些性能损失,但相对较小
clojure.data.json=> (time (do (clojure.data.json/write-str data :indent true) nil)) "运行时间:250.18毫秒"
我还修复了一个小错误:{{(seq m)}}在{{write-object}}中应该是{{(seq x)}}。