使用JsonObject作为Jersey 2响应的实体

时间:2016-09-07 04:38:21

标签: java jersey-2.0

我有这个简单的代码:

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)。我从教程中复制了这段代码,但没有正确解释发生了什么......

1 个答案:

答案 0 :(得分:0)

我希望我能给你一个更好的答案,这是一个暗示,直到更好的答案到来。这里有一些活动部件。 JsonObject是一个接口。它的实现没有描述。此外,还有一个Json序列化程序将您返回的对象转换为Json文本。正是这些事情共同导致了这个Json架构输出。当您执行RemoteMessage变体时,序列化程序只返回String。但是当你返回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序列化器。看看你是否可以选择一种模式。