Jersey / JAX-RS:将地图作为XML / JSON返回

如何使用Jersey / JAX-RS框架将Map作为XML / JSON文档返回并不是那么明显。 它已经支持List ,但是当涉及到Map ,没有MessageBodyWriter 。 即使我将Ma嵌入到包装类中,XML模式中也没有map类型。

关于如何将Map编组到Jersey中的XML / JSON文档的任何实用建议?

我知道它的回复很晚,但我希望它有一天会帮助某人:)我应用的最简单,最快捷的修复方法是

 @GET @Path("/{messageId}") @Produces(MediaType.APPLICATION_JSON) public Response getMessage(@PathParam("messageId") long id) { Map map = new HashMap<>(); map.put("1", "abc"); map.put("2", "def"); map.put("3", "ghi"); return Response.status(Status.OK).entity(map).build(); } 

输出:{“1”:“abc”,“2”:“def”,“3”:“ghi”}

这绝对可以帮助您解决问题。

在Java EE 7中执行此操作非常容易。

REST资源类:

 package com.mycompany.maptojson.rest; import java.util.HashMap; import java.util.Map; import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.enterprise.context.RequestScoped; @Path("maps") @RequestScoped public class MapToJson { @GET @Produces("application/json") public Map getJson() { Map theMap = new HashMap<>(); theMap.put("foo", "bar"); return theMap; } } 

Application

 package com.mycompany.maptojson.rest; import java.util.Set; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("webresources") public class ApplicationConfig extends Application { @Override public Set> getClasses() { Set> resources = new java.util.HashSet<>(); // following code can be used to customize Jersey 2.0 JSON provider: try { Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature"); // Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature"); // Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature"); resources.add(jsonProvider); } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex); } addRestResourceClasses(resources); return resources; } private void addRestResourceClasses(Set> resources) { resources.add(com.mycompany.maptojson.rest.MapToJson.class); } } 

如您所见,您可以将不同的类配置为jsonProvider

 Class.forName("org.glassfish.jersey.jackson.JacksonFeature"); 

要么

 Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature"); 

要么

 Class.forName("org.glassfish.jersey.jettison.JettisonFeature"); 

我知道已经有一段时间了,但也许有人会发现它很有用。

我遇到了类似的问题,而且看起来,只有jackson目前支持这种直接的Map to JSON映射。

Jersey中 ,它就像从资源方法返回地图一样简单:

 @Path("myResource") public class MyResource { @GET @Produces(MediaType.APPLICATION_JSON) public Map getMap() { Map map = new HashMap(); map.put("some key", "some value"); return map; } } 

并从客户端访问它:

 // ... (client initialization) Map map = client.target().path("myResource").request("application/json").get(Map.class); 

使用Jackson (而不是MOXy ),您需要手动注册JacksonFeature ,例如在javax.ws.rs.core.Application子类(或Jersey中的 ResourceConfig )中:

 public class MyApp extends ResourceConfig { public MyApp() { super(MyResource.class, JacksonFeature.class); } } 

并且一定要在类路径上安装Jersey Jackson模块 。 在maven中,只需添加:

  org.glassfish.jersey.media jersey-media-json-jackson ...  

没有maven,添加所有依赖项可能会有点棘手。 这就是全部,这应该有效。 至少与jackson提供商。

它在Jettison中对我不起作用,id在MOXy不起作用 (打开了一个问题 )。

希望这可以帮助。

对我有用的解决方案(使用jettison):

 @GET @Produces(MediaType.APPLICATION_JSON) public Response getJson() { Map testMap = new HashMap<>(); testMap.put("Key1", "value1"); testMap.put("key2", "value2"); JSONObject obj = new JSONObject(testMap); return Response.status(200).entity(obj).build(); } 

默认情况下,Jersey使用MOXy XML / JSON提供程序。 因此,如果您想使用MOXy,则需要添加单独的适配器。 简单的解决方案是,从pom.xml中删除MOXy依赖项并添加Jackson依赖项。 jackson将照顾一切。

  org.glassfish.jersey.media jersey-media-json-jackson {latest version}  

对不起,我不确定为什么MOXy是Jeresey的默认提供商。

 public class BeanClass{ private int duration, Id; private String description; private User user = new User(); Map map = new HashMap<>(); } @GET @Produces({ MediaType.APPLICATION_JSON }) // , MediaType.APPLICATION_XML public Response getAll() { List lstBean = ... return Response.ok().entity(lstBean).build(); } 

谢谢,