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

欢迎!请参阅关于页面以获取更多有关此如何工作的一些信息。

0
data.json
重新分类

你好

我是Clojure新手,因此如果这不是问题的话,请原谅我。

假设我们有数据

{:space1/value 123 :space2/value 456}

并使用clojure.data.json作为序列化程序

(clojure.data.json/write-str {:space1/value 123 :space2/value 456})
=> "{\"value\":123,\"value\":456}"

正如您所看到的,结果是人们无法预料的。
显然的解决方案是为自己的key-fn提供处理,然后忘记它。但我花了大量时间来捕捉由默认实现引起的错误,所以我希望节省其他人的时间。

1 答案

+1
by

文档清楚地说明了为什么会出现这种情况。

:key-fn function

    Single-argument function called on map keys; return value will
    replace the property names in the output. Must return a
    string. Default calls clojure.core/name on symbols and
    keywords and clojure.core/str on everything else.

不可能在事后更改,因为这会破坏现有的代码。

by
换句话说,是否优先考虑有缺陷的默认实现,而不是修复可能会破坏某些内容的错误?
这不是一个错误,这是一个行为。
您默认更喜欢`(subs  (str %) 1)`的keyfn。
例如,我更喜欢默认的`(name %)`。

这种行为工作得很好,并且有很好的文档。现在我看不出有“错误”。
关于看到错误的问题。
我个人认为生成具有重复键的JSON是一个错误。想知道是否有人会不同意这一点。

更接近我的观点。什么是`default`实现?我期望`default`实现产生*正确*的结果,而不是符合我的/ Someone/美学偏好的结果。这里有相反的情况。
`{"a" "str" (symbol "a") "sym" :a "kw"}`将会使用你的“正确”解决方案产生`{"a": "str", "a": "sym", "a", "kw"}`。

重复键不是无效的JSON。在大多数浏览器实现中,“最后一个”将是“真实的”。
https://stackoverflow.com/questions/21832701/does-json-syntax-allow-duplicate-keys-in-an-object

我个人会手动将每个合格字段映射成一个无符号字段,以生成JSON。
...