2017-09-03 101 views
0

在我的Spring Boot應用程序中,當我寫一個類時,我想在序列化時排除該類的對象中的null值,我只需使用@JsonInclude(Include.NON_NULL)註釋該類,或者在屬性文件中指定屬性spring.jackson.serialization-inclusion=NON_NULLSpring Boot Jackson:如何從java數組中刪除空值?

但現在我有一個控制器,它返回我的類的Java數組(不是Collection)爲:

@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE) 
public Review[] searchReviews(@RequestParam Map<String, String> params) { 

而且很多時候這個數組不完全在這種情況下,我得到null的位置沒有物品的地方。

如何告訴Jackson在序列化時忽略Java數組中存在的空值?

我只是給它一個鏡頭通過將標註在我的控制方法的頂部是這樣的:

@JsonInclude(JsonInclude.Include.NON_NULL) 
@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE) 
public Review[] searchReviews(@RequestParam Map<String, String> params) { 

這:

@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE) 
public @JsonInclude(JsonInclude.Include.NON_NULL) Review[] searchReviews(@RequestParam Map<String, String> params) { 

這不會給任何錯誤,但沒有按」不管工作。

試着設置屬性文件中的屬性,沒有工作。

檢索了用於Jackson序列化功能的github documentation,但沒有發現任何能夠在序列化時省略來自Java數組的null值。最接近的功能是write_empty_json_arrays,但那不是我所需要的。

是否java數組需要是固定長度的事實必須做這件事?

我應該怎麼做才能將一個java數組:[object1, object2, null]大小爲3到[{}, {}]而不是[{}, {}, null]

+1

只是做了正確的事情濾除null vaues,並停止返回部分填充陣列。根本不要甚至返回數組。返回列表(或集合)。正確做事有助於。您不應該試圖調整Jackson來彌補代碼中的設計問題。您應該修復設計問題。 –

+1

不確定關於傑克遜,但您可以使用java 8流來過濾其中值!= null的數組,然後將流收集回數組 –

+0

@JBNizet爲什麼這不是正確的事情?我的要求是返回前20的評論。我返回了20條評論。如果沒有足夠的評論,則null存在於數組中。我可以使用'List '做到這一點,但在此之前,我很好奇,爲什麼這不是正確的事情。你能提供一些見解嗎? –

回答

1

您絕對應該更改業務邏輯,不要返回具有null值的數組。或者,你可以使用Java 8的流產生的陣列,例如:

Review[] reviews = //result; 
return Arrays.stream(reviews) 
    .filter(r -> r != null) 
    .toArray(Review[]::new);