请分享您的想法至 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))
"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)}}。

2 个回答

0
参考文献: https://clojure.atlassian.net/browse/DJSON-18 (由 tonsky 报告)
0

此补丁已在至少 clojure.data.json 2.4.0 中应用,但 :indent boolean 选项没有在 write 函数的 docstring 中进行文档说明。

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

by
我已经更新了 docstring,以添加 :indent 以供下一个版本使用。我已将缩进控制记录在 https://clojure.atlassian.net/browse/DJSON-60 以供将来参考。
by
感谢快速修复!还有一件事(对于最初没有提到这件事表示歉意):`json/pprint` 的 docstring 应该更新,以指明不支持 `:indent`。
by
谢谢,已修复。
...