如何将EDN输出转换为定义了自定义读卡器的JSON



在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?

提前谢谢。

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

(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(.writeString jsonGenerator (str c))))

相关内容

  • 没有找到相关文章

最新更新