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放入类路径中。 另请参阅此答案和此答案以及此博客文章 。 为什么在地球上这不是我不知道的标准行为。