7

我正在使用 JAX-RS 在 Java 中创建安静的 Web 服务。我在生成的 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"}}

实现这一目标的最简单方法是什么?我可以自由地重新定义我的数据类,但我无法提前知道地图的键或大小。

4

3 回答 3

5

最简单的方法是使用List<Pair>where Pairis just a Javabean with two properties。

于 2009-12-14T11:48:18.307 回答
1

“JAXB 规范定义了 Map 用作 bean 的属性时的特殊处理。”

鉴于此,我认为(目前)除了编写自己的 MessageBodyWriter (https://jsr311.dev.java.net/nonav/javadoc/javax/ws/rs /ext/MessageBodyWriter.html )

于 2010-01-25T21:17:38.777 回答
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 放在你的类路径中。另请参阅此答案此答案以及此博客文章。为什么这不是我不知道的标准行为。

于 2012-11-30T13:50:47.877 回答