Как я могу преобразовать вывод EDN в JSON, для которого определены пользовательские считыватели - PullRequest
0 голосов
/ 20 февраля 2020

В Clojure я использую функцию 'generate-string' библиотеки 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 выход выше указанного?

Заранее спасибо.

1 Ответ

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

Добавление пользовательского кодера, как показано ниже, помогает решить эту проблему.

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