2016-09-07 35 views
0

我有这个简单的代码:使用的JSONObject作为实体泽西2响应

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

你知道你正在使用哪个JSON序列化程序吗? Moxy,杰克逊,Gson等...? –

+0

我期待'{“hello”:“world”}'。我不知道我正在使用哪个序列化程序。如何找出答案? – akonsu

回答

0

我希望我对你有一个更好的答案,这更多的提示,直到更好的答案到达。这里有几个移动部件。 JsonObject是一个接口。它的实现没有描述。此外,还有一个Json序列化程序,可将返回的对象转换为Json文本。这些都是导致这个Json模式输出的东西。当你做了.toString()变体时,序列化器就像原样返回字符串。但是当你返回JsonObject的时候,你有这两种动态,JsonObject的实现和序列化器的实现。既然你使用的是Jersey 2.0,你可以使用Jackson,Moxy或Jettison序列化程序。这些在序列化JsonObject时可能会有不同的输出,但我们必须测试以确定。此外,JsonObject的实现可能被配置为当你选择的序列化器串行化时导致它的输出是Json模式,而不是普通的Json。这可以通过使用特定于所选Json串行器的注释来完成。

在我的职业生涯中,我使用了多个Json串行器。杰克逊可能是那里最受欢迎的一个。但我也广泛使用了Gson。在一个项目中,我们以某种方式配置Gson,在序列化POJO时,其序列化的Json输出作为Json模式出现。所以它在一定条件下有一个Json串行器输出Json模式并不遥远。

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

在这种情况下,您将不得不运行测试以更深入地了解正在发生的事情。例如,我会首先测试序列化器对与您创建的JsonObject相匹配的POJO。然后,我还会测试同一个JsonObject上的其他Json序列化器。看看你是否可以选择一个模式。