在内部,`clojure.data.json/write` 在遇到 `clojure.lang.Named` 的实例时调用了 `name`,从而去掉了命名空间
(json/write {:foo/bar :baz/bork}
*out*
:escape-slash false)
;; => {"bar":"bork"}
`clojure.data.json/write` 函数提供了选项 `:key-fn` 和 `:value-fn` 来改变这种(或任何其他)行为,用于映射键值
(json/write {:foo/bar :baz/bork}
*out*
:escape-slash false
:key-fn (comp str symbol)
:value-fn (fn [k v] (if (instance? clojure.lang.Named v)
(str (symbol v))
v)))
;; => {"foo/bar":"baz/bork"}
但这在其他上下文中不适用(并且根据文档字符串,这不是它的用途)
(json/write {:foo/bar [:baz/bork]}
*out*
:escape-slash false
:key-fn (comp str symbol)
:value-fn (fn [k v] (if (instance? clojure.lang.Named v)
(str (symbol v))
v)))
;; => {"foo/bar":["bork"]}
在所有上下文中更改此行为的唯一机制是扩展 `JSONWriter` 协议,但这将改变全局行为。如果有选项可以在所有上下文中保留命名空间,或者在不全局更改的情况下覆盖给定类型的写入方式,那就很好了。