Допустим, у меня есть REST API в java, и он поддерживает ответы в формате JSON или XML. Ответы содержат одни и те же данные, но форма не идентична .Например, в json у меня может быть:
{
"persons": [
{
"name":"Bob",
"age":24,
"hometown":"New York"
}
]
}
В то время как в XML это выглядит так:
<persons>
<person name="bob" age="24">
<hometown>New York</hometown>
</person>
</persons>
То есть некоторые значения являются атрибутами человека, а другие — дочерними элементами. В Java, используя JAXB и Jackson, такие различия легко скрыть с помощью аннотаций к объектам модели, например:
public class Person {
@XmlAttribute
String name;
@XmlAttribute
Integer age;
@XmlElement
String hometown;
}
JAXB читает аннотации, а Jackson использует имена полей, чтобы понять, что делать. Таким образом, с одной моделью легко поддерживать несколько выходных форматов.
Итак, мой вопрос: как сделать то же самое в clojure. Я знаю, что есть clj-json, который может легко конвертировать карты и векторы clojure в json (используя jackson, если я не ошибаюсь). И я знаю, что есть и clojure.xml.emit, и clojure.contrib.xml.prxml, которые могут десериализовать карты и векторы в XML. Но если я не ошибаюсь, я не думаю, что эти двое будут очень хорошо работать вместе.
Поскольку prxml ожидает, что узлы xml будут выражены в виде векторов, а атрибуты xml будут выражены в виде карты, это принципиально отличается от работы clj-json, где векторы представляют массивы, а карты представляют объекты. И clojure.core.emit ожидает карту в виде {:tag :person :attrs {:name "Bob" :age 24} :content ...}
, что опять же полностью отличается от того, что clj- json хочет.
Единственное, что я могу придумать, это отформатировать структуры данных для prxml в моем коде, а затем написать функцию, которая преобразует структуру данных в то, что нужно clj-json, когда тип ответа — JSON. Но это кажется каким-то хромым. Я бы предпочел, чтобы была пара библиотек JSON и XML, которые были бы совместимы так же, как JAXB и Jackson.
Идеи?