我有这个简单的代码:
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)。我从教程中复制了这段代码,但没有正确解释发生了什么......
答案 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序列化器。看看你是否可以选择一种模式。