2012-04-25 129 views
6

我們正在使用傑克遜向我們的客戶發送數據的傑克遜&。由於客戶端是Javascript,如果沒有該屬性的有效值(JaxRS默認情況下),我們並不需要發送空值或空數組。有沒有解決的辦法?優化傑克遜/傑克遜排除空值,空列表,陣列

一個例子。 JAXRS發送此:

{"prop1":[],"prop2":null,"prop3":"foo"}

在那裏我們可以有

{"prop3":"foo"}

回答

8

有多種方法可以實現這一點,具體取決於;註釋@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)是一種方法。或者,由於您還想刪除空列表,數組,請將NON_NULL更改爲NON_EMPTY。

也可以將其配置爲默認行爲;在傑克遜1.9:

mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
    JsonSerialize.Inclusion.NON_EMPTY)); 

,並在傑克遜2.0,簡單一點:

mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY); 
+0

請注意,這些方法僅適用於傑克遜,而不適用於使用JAX-RS的供應商。 – Zero3 2015-06-30 14:18:45

+0

是的。據我所知,JAX-RS幾乎沒有標準化的配置設置,並且沒有值類註釋。 – StaxMan 2015-07-08 03:50:07

2

首先從您的JSON所有下探性質的僥倖可能會導致錯誤或在客戶端代碼不清 - 的客戶端必須在使用它之前檢查給定的屬性是否存在,如果屬性丟失,則會報告JavaScript錯誤。無聊的東西。

由於HTTP通信是gzipped,刪除屬性的潛在收益似乎並不顯着(我可能是錯的,顯然 - 我不知道你的應用程序)。 GET請求可以被有效地緩存,所以還有一個理由來避免這種優化。

您可以根據需要自定義Java對象的序列化爲JSON。請參閱此問題How can I customize serialization of a list of JAXB objects to JSON?以獲得進一步解釋如何執行此操作。

+1

感謝。我對我的意圖有點不誠實。實際上,我在開發客戶端時開始使用非常乾淨的靜態JSON,但由於該文件中的大多數屬性都是可選的且很少使用,因此服務器生成的版本非常大而且很難看。你可能是對的,這不是一個真正的性能問題,但是閱讀起來比閱讀困難得多。感謝您的鏈接。 – 2012-04-27 02:49:49