Java 使用JERSEY和JACKSON解析结构未知的POST请求

Java 使用JERSEY和JACKSON解析结构未知的POST请求,java,json,rest,jax-rs,jersey-2.0,Java,Json,Rest,Jax Rs,Jersey 2.0,我现在的情况是,我有一个REST端点,它接受传入JSON消息的POST 问题是我不认为我可以指定POJO对象,这样Jackson就可以将JSON打包到POJO对象中。原因是我无法控制到达该端点的内容,字段的数量和类型可能会随着时间的推移而变化,因此,事先定义POJO似乎不是一个选项 所以我想问题是……我能简单地告诉Jackson不要做任何编组并给出响应字符串吗?我可以稍后用JSONObject JSONArray或Gson来处理这个问题。假设我有一个这样的方法: @POST @Path("/ca

我现在的情况是,我有一个REST端点,它接受传入JSON消息的POST

问题是我不认为我可以指定POJO对象,这样Jackson就可以将JSON打包到POJO对象中。原因是我无法控制到达该端点的内容,字段的数量和类型可能会随着时间的推移而变化,因此,事先定义POJO似乎不是一个选项

所以我想问题是……我能简单地告诉Jackson不要做任何编组并给出响应字符串吗?我可以稍后用JSONObject JSONArray或Gson来处理这个问题。假设我有一个这样的方法:

@POST
@Path("/callback")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response facebookUpdate(String json) {
    //Do something with the json response...
}
如果这对Jersey JAX不可行,还有其他选择吗

谢谢!
Alejandro

如果您知道Json格式的数据结构,您可以尝试使用JAXB,它可以完美地使用它。您可以创建一个带注释的简单类,然后可以使用对象而不是字符串

最简单的方法是不将json注入方法,而是使用请求对象:

public Response facebookUpdate(@Context request) {
    try(InputStream is=request.getEntityInputStream()) {
       ...
    }
}
然后,您可以从请求中获取请求的inputstream,并以您喜欢的方式对其进行解析

对于解析,我可以推荐我自己的库,它是专门为支持您描述的开放式场景而编写的,并使用jackson反序列化为java.util.Map和java.util.List的高度定制实现。Gson也是一个非常可靠的选择


如果您想在整个应用程序范围内执行此操作,您可以编写自己的@Provider并在那里执行相同的操作。这就是我目前实际使用我的库的方式

谢谢,但我想我在标题“未知结构”中明确指出这是可行的。但是,我将实现一个自定义参数类,而不是显式地处理这个问题。Jersey不是很挑剔,你可以有一个任何类的对象,它提供一个
valueOf(String)
方法,一个以
String
作为参数的构造函数,或者一个
fromString(String)
方法。听起来是一个封装解析的好地方。好的,我会试试Tom,谢谢bunchThanks Jilles,我会看看你的库。这是一个有效的回答,因此它适用于您。作为旁注,我尝试将一个简单的字符串传递给该方法,它也可以工作,因此我也可以直接进行解析……以防万一其他人遇到这种情况:)是的,我想这取决于jackson提供程序配置为处理的类型。不过,在解析它们之前不将它们作为字符串进行缓冲总是很好的。