clojure.data.json / write:应用谓词来确定值引用

时间:2017-04-24 16:23:11

标签: json clojure

假设我有一张简单的地图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提供我所描述的内容吗?

2 个答案:

答案 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”是错误的起点。