在内部,`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` 协议,但这会全局地更改行为。如果能够提供一个所有上下文中都保留命名空间的选项,或者在不对全局行为进行更改的情况下覆盖给定类型的写入方式,将是有帮助的。