2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!有关如何使用本站的更多信息,请参阅 关于 页面。

0
data.json

你好!

格式化的 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 毫秒"

我还修复了一个小错误:在 {{write-object}} 中的 {{(seq m)}} 应当是 {{(seq x)}}。

2 个答案

0
参考资料: https://clojure.atlassian.net/browse/DJSON-18(由 tonsky 提出)
0
by

这个补丁已被应用(至少自 clojure.data.json 2.4.0 版起),但是在 write 函数的文档字符串中未记录 :indent boolean 选项。

此外,缩进目前固定为每个深度级别 2 个空格。这是一个合理的默认值,但可能需要将 :indent 选项扩展以允许自定义每个级别的空格数。《:indent true》相当于《:indent 2》,而《:indent false》相当于《:indent 0》。

by
我已经更新了文档字符串以添加 :indent 以供下一次发布。我已将缩进控制日志记录到 https://clojure.atlassian.net/browse/DJSON-60 用于未来。
by
感谢快速修复!还有一件事(很抱歉刚开始没有提到):应该更新 json/pprint 的文档字符串以表明不支持 :indent
by
谢谢,已修复。
...