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

欢迎!请查阅关于页面获取更多关于如何使用本站的信息。

0
data.json
重新分类 Serhii Suprun

你好

我是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,并忽略它。但我花了大量时间来修复由默认实现引起的bug,希望节省其他人的时间。

1 答案

+1
回答 Eugene Pakhomov

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

: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.

由于会破坏现有代码,所以不能在事后更改。

评论 Serhii Suprun
换句话说,拥有有缺陷的默认实现是否比修复可能会搞砸某处的实现更为可取?
by
这不是一个bug,这是一个行为。
你默认更喜欢`(subs  (str %) 1)`这个keyfn。
另一例,比如我,默认更喜欢`(name %)`。

这个行为工作得很好,并且有很好的文档。现在我看不到所谓的"bug"。
by
关于看到bug。
我个人认为,生成具有重复键的JSON是一个bug。我想知道是否有人不同意这个观点。

更接近我的观点。什么是"默认"实现?我期望从"默认"实现得到*正确*的结果,而不是匹配我所需要的结果或美学偏好的结果。而且我们在这里是相反的。
by
`{"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

我个人,我会手动将每个Qualified字段映射到一个Unqualified字段,以生成JSON。
...