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

Java 使用JsonObject作为Jersey 2响应的实体,java,jersey-2.0,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.c

我有一个简单的代码:

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
(比如:
返回Response.status(200).entity(result).build()
),我会在客户端上得到JSON,其中包括类型信息等,但不是我所期望的:

{"hello":{"chars":"world","string":"world","valueType":"STRING"}}
这是甚么意思呢?将
JsonObject
传递给它与传递字符串有何不同


另外,我在文档()中没有找到
Response.entity
方法。我从一个没有正确解释发生了什么的教程中复制了这段代码…

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

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

当序列化POJO(又名JavaBeans)时,在JavaBean上使用序列化程序的默认设置时,您需要一个常规的Json输出。但当发送回可能与特定Json序列化程序有复杂交互的对象时,您可能会得到不同的Json输出


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

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

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

当序列化POJO(又名JavaBeans)时,在JavaBean上使用序列化程序的默认设置时,您需要一个常规的Json输出。但当发送回可能与特定Json序列化程序有复杂交互的对象时,您可能会得到不同的Json输出


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

你期待什么?仅值?您知道您正在使用哪个JSON序列化程序吗?莫西、杰克逊、格森等…?我希望
{“你好”:“世界”}
。我不知道我正在使用哪个序列化程序。如何找到答案?查看此链接:你期待什么?仅值?您知道您正在使用哪个JSON序列化程序吗?莫西、杰克逊、格森等…?我希望
{“你好”:“世界”}
。我不知道我正在使用哪个序列化程序。如何查找?请查看此链接: