2017-02-08 15 views
0

我正在使用Jersey和Jackson構建Web應用程序。通過使用類似於下面的代碼片段的邏輯來返回響應。 (不相關的部分都將被刪除)避免以特定值響應JSON字段

public Response toResponse() { 
    String name = // some methods to get name 
    Integer score = // some methods to get score 
    final MyDTO dto = new MyDTO(name, score); 
    return Response 
     .ok() 
     .encoding(StandardCharsets.UTF_8.toString()) 
     .type(MediaType.APPLICATION_JSON_TYPE) 
     .entity(dto) 
     .build(); 
} 

而且MyDTO類:

@XmlRootElement 
public final class MyDTO { 
    @NotNull final private String name; 
    @NotNull final private Integer score; 
    // constructor, getters, setters... 
} 

而且我不允許有MyDTO唯一的非空值。 我想要實現的是當score剛好等於0時,在JSON響應中隱藏score字段。 我查看了herehere等問題,但找不到可用的答案。

例子:
當約翰的比分是1:{"name": "John", "score": 1}
當約翰的比分是0:{"name": "John"}

+0

你是什麼意思隱藏?你想完成刪除它或只是將其設置爲私人? –

+0

@JonathanPortorreal完全從JSON響應中刪除字段 – choasia

+0

我想不出任何聰明的方法,但是您可以創建另一個沒有「分數」字段的類,並在必要時使用該字段。 –

回答

2

由@Henrik使用應答改變註釋JsonInclude.Include.NON_DEFAULT。希望這是你所期待的

+0

雖然我無法自己定義默認值,但它確實適用於當前需求!非常感謝。 – choasia

0

決定嘗試@ BalakrishnaAvulapati的建議,它肯定似乎是正確的做法。

@JsonInclude(JsonInclude.Include.NON_NULL) 
public static class Player { 
    private String nick; 
    private Integer score; 

    // Omitting getter/setter for nick field 

    public Integer getScore() { 
     return score; 
    } 

    public void setScore(int score) { 
     this.score = score == 0 ? null : Integer.valueOf(score); 
    } 
} 
+0

嗨,這是一個很好的方法,但它會引起一些副作用,因爲'MyDTO'不應該有任何空值的字段。這是一個簡化的代碼片段,我很抱歉,我沒有在問題中提到它。如果您可以給出答案而不將其設置爲空,我將不勝感激。 – choasia

+0

@choasia:好吧,如果我有另一種方法,我不會「偷走」這個相當優雅的。 :) – Henrik

+0

@choasia:但是你可能想開始研究創建你自己的專用串行器。 – Henrik

相關問題