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