如何将 EDN 输出转换为定义了自定义阅读器的 JSON
How can I convert EDN output to JSON which has custom readers defined
在 Clojure 中,我使用柴郡 (https://github.com/dakrone/cheshire) 库的 'generate-string' 函数将 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))
)
)
在 Clojure 中,我使用柴郡 (https://github.com/dakrone/cheshire) 库的 'generate-string' 函数将 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))
)
)