поддержка ответов REST в формате xml и json в clojure

Допустим, у меня есть 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.

Идеи?

6
задан Kevin 31 March 2012 в 21:21
поделиться