2016-09-07 38 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序列化器。看看你是否可以選擇一個模式。