【问题标题】:using JsonObject as entity for Jersey 2 response使用 JsonObject 作为 Jersey 2 响应的实体
【发布时间】:2016-09-07 04:38:21
【问题描述】:

我有这个简单的代码:

package com.example

import javax.json.Json;
import javax.json.JsonObject;

...

@Path("/")
public class Resource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response defaultEntry() {
        JsonObject result = (Json.createObjectBuilder()
                             .add("hello", "world")
                             .build());

        return Response.status(200).entity(result.toString()).build();
    }
}

我是 Java 新手,谁能解释一下原因,如果我省略了对 result.toString() 的调用,而只是将 result 传递给 .entity(就像这样:return Response.status(200).entity(result).build()),我会在客户端得到 JSON包括类型信息等,但不是我所期望的:

{"hello":{"chars":"world","string":"world","valueType":"STRING"}}

这样做的目的是什么?将JsonObject 传递给它与传递字符串有何不同?

另外,我在文档中没有找到Response.entity 方法(https://jersey.java.net/apidocs/2.11/jersey/javax/ws/rs/core/Response.html)。我从教程中复制了这段代码,但没有正确解释发生了什么......

【问题讨论】:

  • 你在期待什么?只有价值观?
  • 您知道您使用的是哪个 JSON 序列化程序吗? Moxy、Jackson、Gson 等...?
  • 我期待{"hello": "world"}。我不知道我使用的是哪个序列化程序。如何发现?

标签: java jersey-2.0


【解决方案1】:

我希望我能给你一个更好的答案,这更像是一个提示,直到更好的答案到来。这里有一些活动部分。 JsonObject 是一个接口。没有描述它的实现。此外,还有一个 Json 序列化程序可以将您返回的对象转换为 Json 文本。正是这些东西共同导致了这个 Json 模式输出。当您执行.toString() 变体时,序列化程序只是按原样返回字符串。但是,当您现在返回 JsonObject 时,您将拥有这两个动态,即 JsonObject 的实现和序列化器的实现。由于您使用的是 Jersey 2.0,因此您可以使用 Jackson、Moxy 或 Jettison 序列化程序。在序列化 JsonObject 时,这些都可能有不同的输出,但我们必须进行测试才能确定。此外,JsonObject 实现的配置方式可能是,当您选择的序列化程序对其进行序列化时,会导致其输出为 Json 模式,而不仅仅是常规的 Json。这可以使用特定于所选 Json 序列化程序的注释来完成。

在我的职业生涯中,我使用了多个 Json 序列化器。杰克逊可能是那里最受欢迎的人。但我也广泛使用了 Gson。在一个项目中,我们以某种方式配置了 Gson,其中序列化的 Json 输出在序列化 POJO 时以 Json 模式出现。因此,在某些条件下让 Json 序列化程序输出 Json 模式并不牵强。

在序列化 POJO(又名 Java Bean)时,在 Java Bean 上使用序列化程序的默认设置时,您期望得到常规的 Json 输出。但是,当发回可能与特定 Json 序列化程序具有复杂交互作用的对象时,您可能会得到不同的 Json 输出。

在这种情况下,您必须运行测试才能更深入地了解正在发生的事情。例如,我将首先针对与您创建的 JsonObject 匹配的 POJO 测试序列化程序。然后我还会在同一个 JsonObject 上测试其他 Json 序列化程序。看看你能不能找到一种模式。

【讨论】:

    【解决方案2】:

    数据类型模块jackson-datatype-jsr353 提供对javax.json 类型的支持。该页面包含如何添加依赖项以及使用 Jackson 的 ObjectMapper 注册模块的说明。

    从 Jackson 2.11.0 开始,该模块移至 jackson-datatypes-misc 的保护伞下。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多