0

在 Clojure 中,我使用 cheshire ( https://github.com/dakrone/cheshire ) 库的“生成字符串”函数将 EDN 转换为 JSON。

它适用于没有自定义阅读器的 EDN。例如:

sample.edn: 
{:foo "bar" :baz {:eggplant [1 2 3]}

sample.clj:
(generate-string (edn/read-string (slurp sample.edn))


Output =>
{
  "foo": "bar",
  "baz": {
    "eggplant": [1,2,3]
  }
}

但是,如果 EDN 具有调用 java 代码创建新对象的自定义阅读器,则它无法将 EDN 输出转换为 JSON。

例如:

EDN file:
{
   "version" "1.0"
   "xyz" #xyz/builder "testString"
}


Clojure code:

(defn getXyz [str]
    (.getXyz (XyzBuilder.) str)
)

(defn custom-readers []
    {'xyz/builder getXyz}
)

(edn/read-string
                {:readers (custom-readers)}
                (slurp filename)
)

如果 EDN 文件如上所示,它无法生成 JSON 输出,因为 EDN 输出包含创建的对象的哈希码,如

{"version" "1.0", 
 "Xyz" #object[com.java.sample.Xyz 0x6731787b "Xyz [type=type_1]"]}

有没有办法从上面的输出中生成 JSON?

提前致谢。

4

1 回答 1

1

添加如下自定义编码器有助于解决此问题。

(add-encoder com.java.sample.Xyz
    (fn [c jsonGenerator]
        (.writeString jsonGenerator (str c))
    )
)
于 2020-02-21T01:46:16.727 回答