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

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.

因为修改后可能打破现有代码,所以这不能事后更改。

换句话说,相比于尝试修正可能会打破某些功能的bug,我们宁愿保留这个有bug的默认实现吗?
by
这不是一个错误,这是一个行为。
默认情况下,您更愿意使用`(subs (str %) 1)`作为键函数。
比如说,我更喜欢默认的`(name %)`。

这个行为工作得很好,也得到了很好的文档说明。现在我看不出“错误”在哪里。
by
关于看到错误。
我个人认为,生成重复键的JSON是一个错误。不知道有人会不同意这一点。

更接近我的观点。默认实现是什么?我期望默认实现能够得到*正确*的结果,而不是与我/我们的需求或审美偏好相符的结果。这里的意见是相反的。
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。
...