在内部,`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` 协议,但这将全局改变行为。如果有一个选项可以在所有上下文中保留命名空间,或者覆盖给定类型的写入方式而不全局改变它,那将会很有帮助。