Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Jersey服务中使用JSON对象_Json_Jersey - Fatal编程技术网

在Jersey服务中使用JSON对象

在Jersey服务中使用JSON对象,json,jersey,Json,Jersey,我一直在用谷歌搜索我的屁股,试图找出如何做到这一点:我有一个新泽西休息服务。调用REST服务的请求包含一个JSON对象。我的问题是,在Jersey POST方法实现中,如何访问HTTP请求主体中的JSON 任何提示、技巧、指向示例代码的指针都将不胜感激 谢谢 --Steve我不确定如何获得JSON字符串本身,但您肯定可以获得它包含的数据,如下所示: 定义一个JAXB注释的Java类(C),该类与请求中传递的JSON对象具有相同的结构 e、 g.对于JSON消息: { "A": "a valu

我一直在用谷歌搜索我的屁股,试图找出如何做到这一点:我有一个新泽西休息服务。调用REST服务的请求包含一个JSON对象。我的问题是,在Jersey POST方法实现中,如何访问HTTP请求主体中的JSON

任何提示、技巧、指向示例代码的指针都将不胜感激

谢谢


--Steve

我不确定如何获得JSON字符串本身,但您肯定可以获得它包含的数据,如下所示:

定义一个JAXB注释的Java类(C),该类与请求中传递的JSON对象具有相同的结构

e、 g.对于JSON消息:

{
  "A": "a value",
  "B": "another value"
}
使用类似于:

@XmlAccessorType(XmlAccessType.FIELD)
public class C
{
  public String A;
  public String B;
}
然后,您可以在资源类中使用类型为C的参数定义一个方法。当Jersey调用您的方法时,将基于发布的JSON对象创建JAXB对象

@Path("/resource")
public class MyResource
{
  @POST
  public put(C c)
  {
     doSomething(c.A);
     doSomethingElse(c.B);
  }
}

提交/发布表单/HTTP.POST,其中包含一个以JSON为值的参数

@QueryParam jsonString


public-desolveJson(jsonString)

这使您可以访问原始帖子

@POST
@Path("/")
@Consumes("text/plain") 
@Produces(MediaType.APPLICATION_JSON)
public String processRequset(String pData) {
    // do some stuff, 
    return someJson;
}

如前所述,将
@Consumes
内容类型更改为
text/plain
会起作用,但从RESTAPI的角度来看,这似乎并不正确

假设您的客户必须将JSON发布到API中,但需要将内容类型头指定为
text/plain
。在我看来这不干净。简单来说,如果API接受JSON,那么请求头应该指定
内容类型:application/JSON

为了接受JSON,但将其序列化为
String
对象,而不是POJO,您可以实现一个自定义的JSON。这样做同样简单,而且不必在API规范上妥协

这是值得一读的文件,以便您确切地知道它是如何工作的。我就是这样做的:

第1步。实施一个定制的

上面的
CustomJsonReader
将把JSON有效负载反序列化为POJO,如果您只需要原始JSON,
String
对象

这样做的好处是它将接受
内容类型:application/json
。换句话说,您的请求处理程序可以设置为使用JSON,这似乎是正确的:

@POST
@Path("/stuff")
@Consumes("application/json") 
public void doStuff(String json) {
  /* do stuff with the json string */
  return;
}

Jersey支持使用抛弃类型JSONObject和JSONArray对解析后的JSONObject进行低级访问

<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.3.8</version>
</dependency>

有关更多示例,请参见。

一些答案说服务函数必须使用
consumes=text/plain
,但我的Jersey版本可以使用
应用程序/json
类型。杰克逊和泽西的版本是
jackson core=2.6.1,jersey common=2.21.0

@POST
@Path("/{name}/update/{code}")
@Consumes({ "application/json;charset=UTF-8" })
@Produces({ "application/json;charset=UTF-8" })
public Response doUpdate(@Context HttpServletRequest req, @PathParam("name") String name, 
      @PathParam("code") String code, String reqBody) {
  System.out.println(reqBody);

  StreamingOutput stream = new StreamingOutput() {
    @Override public void write(OutputStream os) throws IOException, WebApplicationException {
      ..my fanzy custom json stream writer..
    }
  };

  CacheControl cc = new CacheControl();
  cc.setNoCache(true);
  return Response.ok().type("application/json;charset=UTF-8")
    .cacheControl(cc).entity(stream).build();
}

客户端提交带有json请求正文的
application/json
请求。Servlet代码可以将字符串解析为JSON对象,也可以按原样保存到数据库。

不幸的是,JSON字符串基本上更多地被用作字典,而不是真正的POJO。我不想为JSON对象创建一个新的POJO。我自己没有试过,但是你可以在这个级别上把JSON流转换成一个映射等等。事实证明,这比我想象的要简单得多。我可以将HTTP请求的主体作为字符串参数获取,然后使用任何JSON库(目前使用Google GSON)处理它,将请求数据转换为本地对象。这不是我想走的路。有一些工具包可以将完整的JSON放入HTTP请求的实际主体中,如果可能的话,我希望遵循这种模式。这是一种从我的客户机传递JSON的灵活、简单的方法,而不需要让服务器/客户机知道我传递的对象。我只是用GSON将它序列化并附加到帖子上。工作得很好!谢谢。这对我不管用。我得到<代码>无法识别的字段“A”(class org.json.JSONObject),未标记为可忽略的…如果我添加以下内容<代码>映射器.configure(在未知属性上反序列化feature.FAIL,false)…然后对象通过空
{}
这是无效的。我得到415个错误。是否有任何解决方案以及需要为低级json访问添加哪些依赖项?我面临着类似的问题。是否有任何解决方案可以使用对JSONObject的低级访问?
<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.3.8</version>
</dependency>
{
  "A": "a value",
  "B": "another value"
}


@POST
@Path("/")
@Consumes(MediaType.APPLICATION_JSON) 
public void doStuff(JSONObject json) {
  /* extract data values using DOM-like API */
  String a = json.optString("A");
  Strong b = json.optString("B");
  return;
}
@POST
@Path("/{name}/update/{code}")
@Consumes({ "application/json;charset=UTF-8" })
@Produces({ "application/json;charset=UTF-8" })
public Response doUpdate(@Context HttpServletRequest req, @PathParam("name") String name, 
      @PathParam("code") String code, String reqBody) {
  System.out.println(reqBody);

  StreamingOutput stream = new StreamingOutput() {
    @Override public void write(OutputStream os) throws IOException, WebApplicationException {
      ..my fanzy custom json stream writer..
    }
  };

  CacheControl cc = new CacheControl();
  cc.setNoCache(true);
  return Response.ok().type("application/json;charset=UTF-8")
    .cacheControl(cc).entity(stream).build();
}