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 毫秒"

我还修复了一个小错误:{{(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

我已经更新了docstring,为下一个版本添加了`:indent`。我将空格控制记录在https://clojure.atlassian.net/browse/DJSON-60,以供将来参考。
谢谢快速修复!另一件事(对不起,最初没有提到):`json/pprint`的docstring应更新,以说明`:indent`不受支持。
谢谢,已修复。
...