我正在使用JAX-RS在Java中创建restful webservices。我在生成的JSON中得到了很多开销。
数据类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {
private Map<String,String> data;
Test() {}
public Test(Map<String,String> data) {
this.data = data;
}
public Map<String, String> getData() {
return data;
}
}
服务:
@GET
@Path("/test")
@Produces("application/json; charset=UTF-8;")
public Test test() {
Map<String,String> map = new HashMap<String,String>();
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"}}
获得此最简单的方法是什么?我可以自由地重新定义我的数据类,但我不能事先知道地图的键或大小。
答案 0 :(得分:5)
最简单的方法是使用List<Pair>
,而Pair
只是一个有两个属性的Javabean。
答案 1 :(得分:1)
"JAXB spec defines a special handling for Map when it's used as a property of a bean."
鉴于此,我认为除了编写自己的MessageBodyWriter(https://jsr311.dev.java.net/nonav/javadoc/javax/ws/rs/ext/MessageBodyWriter.html)
之外,你可以做的事情(目前)还不多。答案 2 :(得分:1)
如果您不使用JAXB带注释的对象,而只使用简单的POJO,只需启用POJO映射功能以及Jackson JSON库即可获得正确的行为。
所以在web.xml
中,如果你正在使用过滤器(类似于servlet),你的配置应该是:
<filter>
<filter-name>Jersey</filter-name>
<filter-class>...</filter-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</filter>
只需依赖maven配置中的jersey-json依赖关系,或者从网站下载并将jackson放入类路径中。另请参阅this answer和this answer以及this blog post。为什么在地球上这不是我不知道的标准行为。