JAX-RS,Map <string,string>到JSON没有开销?</string,string>

时间:2009-12-14 10:34:25

标签: java json rest map jax-rs

我正在使用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"}}

获得此最简单的方法是什么?我可以自由地重新定义我的数据类,但我不能事先知道地图的键或大小。

3 个答案:

答案 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 answerthis answer以及this blog post。为什么在地球上这不是我不知道的标准行为。