如何使用 Cheshire 自定义编码器以 JSON 格式打印 EDN 输出
How to print EDN output in JSON format using Cheshire custom encoder
我是 Clojure 的新手,我正在尝试使用 java 中定义的 类 的 Cheshire 自定义编码器将 EDN 输出打印为有效的 JSON 格式。
My EDN file:
{:xyz #XyzBuilder "testString"}
Clojure code:
(defn getXyz [str]
(.getXyz (XyzBuilder.) str)
)
(defn custom-readers []
{'xyz/builder getXyz}
)
(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(.writeString jsonGenerator (str c))))
(edn/read-string
{:readers (custom-readers)}
(slurp filename)
)
这会生成以下输出:
{"xyz":"Xyz(sampleString=testString)"}
我想以正确的 JSON 格式打印它,如下所示。我怎样才能实现它?
{"xyz":{"sampleString":"testString"}}
提前致谢!
如果您的 java 对象主要由字段组成,请尝试先将其转换为 clojure 映射,然后使用 chechires 的 encode-map
(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(-> c
clojure.java/from-java ;; convert java object to clojure map
(select-keys [:sampleString]) ;; select only relevant fields
(encode-map jsonGenerator))))
我是 Clojure 的新手,我正在尝试使用 java 中定义的 类 的 Cheshire 自定义编码器将 EDN 输出打印为有效的 JSON 格式。
My EDN file:
{:xyz #XyzBuilder "testString"}
Clojure code:
(defn getXyz [str]
(.getXyz (XyzBuilder.) str)
)
(defn custom-readers []
{'xyz/builder getXyz}
)
(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(.writeString jsonGenerator (str c))))
(edn/read-string
{:readers (custom-readers)}
(slurp filename)
)
这会生成以下输出:
{"xyz":"Xyz(sampleString=testString)"}
我想以正确的 JSON 格式打印它,如下所示。我怎样才能实现它?
{"xyz":{"sampleString":"testString"}}
提前致谢!
如果您的 java 对象主要由字段组成,请尝试先将其转换为 clojure 映射,然后使用 chechires 的 encode-map
(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(-> c
clojure.java/from-java ;; convert java object to clojure map
(select-keys [:sampleString]) ;; select only relevant fields
(encode-map jsonGenerator))))