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.

由于它将破坏现有代码,因此不能在事后进行更改。

换句话说,拥有有缺陷的默认实现是优先于修复可能破坏其他部分的实现吗?
这不是一个错误,这是一个行为。
您默认选择`(subs (str %) 1)`作为keyfn。
另一个例子,比如我,默认选择`(name %)`。

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

更接近我的观点。什么是默认实现?我期望从默认实现获得正确的结果,而不是与我/他们需求或审美偏好相匹配的结果。而我们在这里持相反意见。
`{"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。
...