【发布时间】:2012-04-15 02:45:14
【问题描述】:
假设我在 java 中有一个 REST API,它支持 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属性表示为map,与clj-json的工作方式有本质区别,clj-json中向量表示数组,map表示对象。并且 clojure.core.emit 需要 {:tag :person :attrs {:name "Bob" :age 24} :content ...} 形式的映射,这又与 clj-json 想要的完全不同。
我唯一能想到的就是在我的代码中对prxml的数据结构进行格式化,然后写一个函数,在响应类型是json的时候把数据结构转换成clj-json想要的。但这似乎有点蹩脚。如果有一对像 JAXB 和 Jackson 那样兼容的 JSON 和 XML 库,我会更喜欢。
想法?
【问题讨论】:
-
也许看看新的data.xml?
-
这似乎仍然需要像 clojure.xml 期望的那样格式化数据,例如
{:tag :person :attrs {:name "Bob" :age 24} :content ...}. -
我还没有使用过data.xml,但我的想法是可以构建自己的发射器来根据需要写出XML。不过,我不是 100% 确定。
-
感谢您的提问,这给了我一些关于我正在做的类似事情的想法。我仍在寻找有效处理对其他资源的“更深入”引用的方法。
标签: java rest clojure jaxb jackson