【问题标题】:Using JERSEY and JACKSON to parse a POST request with unknown structure使用 JERSEY 和 JACKSON 解析结构未知的 POST 请求
【发布时间】:2014-11-13 21:54:38
【问题描述】:

我目前的情况是,我有一个接受传入 JSON 消息的 POST 的 REST 端点。

问题是我认为我不能指定 POJO 对象,因此 Jackson 可以将 JSON 编组到 POJO 对象中。这样做的原因是我无法控制该端点的内容,并且字段和类型的数量会随着时间而变化,因此,事先定义 POJO 似乎不是一种选择。

所以我想问题是......我可以简单地告诉杰克逊不要做任何编组并给出响应的字符串吗?我可以稍后用 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 不可行......还有其他选择吗?

谢谢! 亚历杭德罗

【问题讨论】:

  • 可行。但是,我没有明确地处理这个问题,而是实现了一个自定义参数类。 Jersey 不是很挑剔,你可以只拥有一个提供valueOf(String) 方法、以String 作为参数或fromString(String) 方法的构造函数的任何类的对象。听起来是一个封装解析的好地方。
  • 好点,我会试试 Tom,非常感谢

标签: java json rest jax-rs jersey-2.0


【解决方案1】:

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

public Response facebookUpdate(@Context request) {
    try(InputStream is=request.getEntityInputStream()) {
       ...
    }
}

然后,您可以从请求中获取请求的输入流并以您喜欢的方式对其进行解析。

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

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

【讨论】:

  • 谢谢 Jilles,我会看看你的图书馆。这是一个有效的回应,所以它适合你。作为旁注,我尝试将一个简单的字符串传递给该方法,它也可以工作,所以我也可以直接进行解析......以防万一其他人遇到这个:)
  • 是的,我想这取决于杰克逊提供者配置处理的类型。尽管如此,在解析它们之前不将它们缓冲为字符串总是很好的。
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多