假设我有一张简单的地图example-map
:
(def example-map {"a" "b" "c" "d"})
我可以将clojure.data.json/write-str
用于JSON-ify这样的地图:
(clojure.data.json/write-str example-map) =>
"{\"a\":\"b\",\"c\":\"d\"}"
我想对所有键应用谓词,以确定是否引用了该键,即使输出无效JSON
。
所需的功能如下:
(defn to-quote? [v] (= v "d"))
(fictional-write-str example-map :quote-rule to-quote?) =>
"{\"a\":\"b\",\"c\":d}"
可选的:value-fn
参数可以clojure.data.json/write-json
提供我所描述的内容吗?
答案 0 :(得分:1)
write-str
通过协议JSONWriter
工作,您可以使用clojure.lang.Symbol
进行扩展,让您拥有自己的方式。
(ns reagenttest.main
(:refer-clojure :exclude (read))
(:require [clojure.data.json :as json]))
(defn- write-named [x out]
(.print out (name x)))
(extend clojure.lang.Symbol json/JSONWriter {:-write write-named})
(prn (json/write-str {"a" 'd "b" "c" "e" :key}))
显示
"{\"a\":d,\"b\":\"c\",\"e\":\"key\"}"
答案 1 :(得分:1)
你不应该使用clojure.data.json来编写不是json的东西。有什么意义?符合条件的解析器将正确拒绝解析您编写的废话。这就是为什么它不容易做到的原因,即库中没有任何东西可以让你这样做。您可以通过嵌入具有实现JSONWriter的特殊类型的对象来作弊,但同样强烈建议不要这样做。
你为什么要这样做?肯定有更合理的方法来解决你的实际问题; “如何让JSON库输出无效的JSON”是错误的起点。