JAX-RS,将映射到JSON而没有开销?
我正在使用JAX-RS在Java中创建restful webservices。 我在生成的JSON中得到了很多开销。
数据类:
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Test { private Map data; Test() {} public Test(Map data) { this.data = data; } public Map getData() { return data; } }
服务:
@GET @Path("/test") @Produces("application/json; charset=UTF-8;") public Test test() { Map map = new HashMap(); map.put("foo", "bar"); map.put("bingo", "bongo"); return new Test(map); }
生产:
{"data":{"entry":[{"key":"foo","value":"bar"},{"key":"bingo","value":"bongo"}]}}
我想要它产生:
{"data":{"foo":"bar","bingo":"bongo"}}
实现这一目标的最简单方法是什么? 我可以自由地重新定义我的数据类,但我事先无法知道地图的键或大小。
最简单的方法是使用List
而其中Pair
只是一个具有两个属性的Javabean。
“当JAXB规范用作bean的属性时,它定义了对Map的特殊处理。”
鉴于此,我认为除了编写自己的MessageBodyWriter( https://jsr311.dev.java.net/nonav/javadoc/javax/ws/rs )之外,您可以做(目前)还有很多工作要做。 /ext/MessageBodyWriter.html )
如果您不使用JAXB带注释的对象,而只使用简单的POJO,只需启用POJO映射function以及Jackson JSON库,即可获得正确的行为。
所以在web.xml
,如果你正在使用filter(类似于servlet),你的配置应该是:
Jersey ... com.sun.jersey.api.json.POJOMappingFeature true
只需依赖maven配置中的jersey-json依赖关系,或者从网站下载并将jackson放入类路径中。 另请参阅此答案和此答案以及此博客文章 。 为什么在地球上这不是我不知道的标准行为。