Как напечатать вывод EDN в формате JSON с помощью пользовательского кодера Cheshire - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок ie с 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 Ответ

1 голос
/ 23 февраля 2020

Если ваш java объект состоит в основном из полей, сначала попытайтесь преобразовать его в карту замыкания, а затем используйте 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)))) 
от chechires
...