Как преобразовать вывод EDN в JSON, для которого определены пользовательские читатели
В Clojure я использую функцию генерации строки из чеширской (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 ответ
Решение
Добавление пользовательского кодировщика, как показано ниже, помогает решить эту проблему.
(add-encoder com.java.sample.Xyz
(fn [c jsonGenerator]
(.writeString jsonGenerator (str c))
)
)