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

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

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

by
我已更新文档字符串,为下一个版本添加了 `:indent`。我已将缩进控制记录在 https://clojure.atlassian.net/browse/DJSON-60 以供未来参考。
by
感谢快速修复!还有一件事(抱歉一开始没有提到):应该更新 `json/pprint` 的文档字符串,以指示不支持 `:indent`。
by
谢谢,已修复。
...