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

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

: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
换句话说,有一个充满错误的原生实现比可能会破坏某些内容的修复更受欢迎吗?
by
这不是一个错误,这是一个行为。
默认情况下,您更喜欢 `(subs (str %) 1)` 的 `keyfn`。
另一个例子,比如我,默认情况下更喜欢 `(name %)`。

这个行为工作是很好的,也编档得很好。我现在看不到一个“错误”。
by
关于发现bug的事情。
个人认为,生成具有重复键的JSON是一个bug。想知道有人会不同意这个看法。

更接近我的观点。`default`实现是什么?我期望`default`实现能产生*正确*的结果,而不是满足我/我们需求或美观偏好的结果。这里我们恰好相反。
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

我个人会手动将每个有资格的字段映射到一个无资格的,以生成JSON。
...