Java Jersey/JAX-RS:以XML/JSON格式返回映射

Java Jersey/JAX-RS:以XML/JSON格式返回映射,java,jersey,jax-rs,Java,Jersey,Jax Rs,如何使用Jersey/JAX-RS框架以XML/JSON文档的形式返回Map,这一点并不明显。它已经支持列表s,但是当涉及到Maps时,就没有MessageBodyWriter。即使我将Ma嵌入到包装器类中,XML模式中也没有map类型 关于如何在Jersey中将地图封送到XML/JSON文档中,有什么实用的建议吗 在JavaEE7中很容易做到这一点 REST资源类: package com.mycompany.maptojson.rest; import java.util.HashMap;

如何使用Jersey/JAX-RS框架以XML/JSON文档的形式返回
Map
,这一点并不明显。它已经支持
列表
s,但是当涉及到
Map
s时,就没有
MessageBodyWriter
。即使我将
Ma
嵌入到包装器类中,XML模式中也没有
map
类型


关于如何在Jersey中将地图封送到XML/JSON文档中,有什么实用的建议吗

在JavaEE7中很容易做到这一点

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<String, String> theMap = new HashMap<>();
       theMap.put("foo", "bar");
       return theMap;
    }
}
如您所见,您可以将不同的类配置为
jsonProvider

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


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

我有一个类似的问题,在我看来,目前只有Jackson支持这种直接映射到JSON的映射

在Jersey中,从资源方法返回地图非常简单:

@Path("myResource")
public class MyResource {
  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Map<String, String> getMap() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("some key", "some value");
      return map;
  }
}
确保类路径上有Jersey Jackson模块。在maven中,只需添加:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>...</version>
</dependency>

org.glassfish.jersey.media
打开)


希望这有帮助。

对我有效的解决方案(使用抛弃):

@GET
@产生(MediaType.APPLICATION_JSON)
公共响应getJson(){
Map testMap=newhashmap();
testMap.put(“键1”、“值1”);
testMap.put(“键2”、“值2”);
JSONObject obj=新的JSONObject(testMap);
返回Response.status(200).entity(obj.build();
}

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

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>{latest version}</version>
</dependency>

org.glassfish.jersey.media
泽西媒体公司
{最新版本}
抱歉,我不知道为什么MOXy是Jeresey的默认提供者

public class BeanClass{
    private int duration, Id;
    private String description;
    private User user = new User();
    Map<String, String> map = new HashMap<>();
 }


@GET
@Produces({ MediaType.APPLICATION_JSON }) // , MediaType.APPLICATION_XML
public Response getAll() {
        List<BeanClass> lstBean = ...
        return Response.ok().entity(lstBean).build();
}
公共类BeanClass{
私有int持续时间,Id;
私有字符串描述;
私有用户=新用户();
Map Map=newhashmap();
}
@得到
@生成({MediaType.APPLICATION_JSON})/,MediaType.APPLICATION_XML
公众回应getAll(){
列表lstBean=。。。
返回Response.ok().entity(lstBean.build();
}

谢谢,

我知道现在回信已经很晚了,但我希望有朝一日它能帮助别人:) 我应用的最简单、最快速的修复方法是

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

    return Response.status(Status.OK).entity(map).build();
}
@GET
@路径(“/{messageId}”)
@产生(MediaType.APPLICATION_JSON)
公共响应getMessage(@PathParam(“messageId”)长id){
Map Map=newhashmap();
地图放置(“1”、“abc”);
地图放置(“2”,“def”);
地图放置(“3”,“ghi”);
返回Response.status(status.OK).entity(map.build();
}
输出: { “1”:“abc”, “2”:“def”, “3”:“ghi” }


这肯定会帮你解决问题。

不知道为什么有人投了接近票,特别是因为“太广泛”的原因。这是一个非常具体的问题…可能重复
public class MyApp extends ResourceConfig {
  public MyApp() {
    super(MyResource.class, JacksonFeature.class);
  }
}
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>...</version>
</dependency>
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getJson() {
    Map<String, String> testMap = new HashMap<>();
    testMap.put("Key1", "value1");
    testMap.put("key2", "value2");
    JSONObject obj = new JSONObject(testMap);

    return Response.status(200).entity(obj).build();
}
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>{latest version}</version>
</dependency>
public class BeanClass{
    private int duration, Id;
    private String description;
    private User user = new User();
    Map<String, String> map = new HashMap<>();
 }


@GET
@Produces({ MediaType.APPLICATION_JSON }) // , MediaType.APPLICATION_XML
public Response getAll() {
        List<BeanClass> lstBean = ...
        return Response.ok().entity(lstBean).build();
}
@GET
@Path("/{messageId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMessage(@PathParam("messageId") long id) {
    Map<String, String> map = new HashMap<>();
    map.put("1", "abc");
    map.put("2", "def");
    map.put("3", "ghi");

    return Response.status(Status.OK).entity(map).build();
}