Как распечатать вывод EDN в формате JSON с помощью пользовательского кодировщика Cheshire
Я новичок в Clojure, и я пытаюсь распечатать вывод EDN в допустимом формате JSON, используя специальный кодировщик Cheshire для классов, определенных в java.
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"}}
Заранее спасибо!
1 ответ
Решение
Если ваш объект 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))))