2016-04-07 75 views
1

將對象轉換爲JSON忽略不設置原語類型我有一個類看起來像下面: -同時使用傑克遜

@JsonSerialize(include = Inclusion.NON_EMPTY) 
public class JsonPojo { 
    private int intVal; 
    private String strVal; 

    public int getIntVal() { 
    return intVal; 
    } 

    public void setIntVal(int intVal) { 
    this.intVal = intVal; 
    } 

    public String getStrVal() { 
    return strVal; 
    } 

    public void setStrVal(String strVal) { 
    this.strVal = strVal; 
    } 
} 

如果我有JsonPojo的一個實例,其中未設置的int字段然後而將其轉換成JSON,如下圖所示傑克遜分配一個默認的0: -

public static void main(String[] args) { 
    JsonPojo jsonPojo = new JsonPojo(); 
    jsonPojo.setStrVal("Hello World"); 
    try { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false); 
     String json = mapper.writeValueAsString(jsonPojo); 
     System.out.println(json); 
    } catch (Exception e) { 

    } 

} 

這將輸出: - {"intVal":0,"strVal":"Hello World"}

有沒有一種方法,我可以忽略當未將intVal設置爲intVal的數據類型爲Integer時,Json輸出中的?如果我將intVal轉換爲Integer,那麼當這個值沒有設置時,它將爲空&做JsonSerialize(include = Inclusion.NON_EMPTY)在轉換到json期間將跳過intVal

但我想知道是否可以實現相同的行爲,而無需將intValint轉換爲Integer

我正在使用傑克遜1.9。

+0

你的問題很有趣。我向作者申請了一個Jsonfilter,希望這可以提供幫助。 –

回答

2

您合作請從jackson.annotations包中嘗試@JsonInclude@JsonProperty註釋。這裏的示例代碼:

JsonPojo類:

public class JsonPojo { 
@JsonInclude(Include.NON_DEFAULT) 
private int intVal; 
@JsonProperty 
private String strVal; 

public int getIntVal() { 
    return intVal; 
} 

public void setIntVal(int intVal) { 
    this.intVal = intVal; 
} 

public String getStrVal() { 
    return strVal; 
} 

public void setStrVal(String strVal) { 
    this.strVal = strVal; 
}} 
+0

我更新了問題。其實我的意思是,如果'intVal'沒有設置,那麼只有在設置時纔會忽略它,然後將它包含在json輸出中。 – tuk

+0

@tuk在這種情況下,您可以使用具有必要標誌的'@ JsonInclude'標籤。我建議你將'intVal'的類型改爲'Integer'並且最初將它設置爲'null',這樣你就可以使用'@JsonInclude(Include.NON_NULL)'。你可以使用舊的,因爲我在答案中顯示,但使用'Include.NON_DEFAULT'的問題是,如果將'intVal'設置爲0,它仍然會忽略它,因爲'int'的默認值爲0。 –

1

Inclusion.NON_EMPTY應該做你期望的。從文檔:

該值指示只有值爲 的值爲null或被視爲空的屬性不包括在內。

Java原始碼int默認爲0(這被認爲是空的)。所以,如果你從來沒有設置它,或者你把它設置爲0輸出應該是{"strVal":"Hello World"}我在傑克遜2.6.3上試過這個,似乎工作,所以我假設有一個問題在1.9

你可以嘗試以下,也許作品在1.9:

@JsonInclude(Include.NON_DEFAULT) 
private int intVal; 

,並刪除include = Inclusion.NON_EMPTY

如果0是你可以一個標誌添加到您的POJO有效值。在你曾經致電二傳手的標誌應該轉向真正:

@JsonIgnore 
    public boolean set = false; 

    public Integer getIntVal() { 
     if (!set) { 
      return null; 
     } 
     return Integer.valueOf(intVal); 
    } 

    public void setIntVal(int intVal) { 
     set = true; 
     this.intVal = intVal; 
    } 
1

以防萬一,如果這是一個可以接受的解決方案:

我們可以應用自定義過濾器來檢查intVal是否設置:

@JsonSerialize(include = Inclusion.NON_EMPTY) 
@JsonFilter("theFilter") 
public class JsonPojo { 
    private int intVal; 
    private String strVal; 

    private boolean isSetIntVal = false; 

    @JsonIgnore 
    public boolean getIsSetIntVal() { 
     return isSetIntVal; 
    } 

    public int getIntVal() { 
     return intVal; 
    } 

    public void setIntVal(int intVal) { 
     this.intVal = intVal; 
     this.isSetintVal = true; 
    } 

    public String getStrVal() { 
     return strVal; 
    } 

    public void setStrVal(String strVal) { 
     this.strVal = strVal; 
    } 
} 

實現自定義過濾器,然後應用到作家:

public static void main(String[] args) { 
    SimpleBeanPropertyFilter theFilter = new SimpleBeanPropertyFilter() { 
     @Override 
     public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, 
       BeanPropertyWriter writer) throws Exception { 

      if (!writer.getName().equals("intVal")) { 
       writer.serializeAsField(pojo, jgen, provider); 
       return; 
      } 
      if (((JsonPojo) pojo).getIsSetIntVal()) { 
       writer.serializeAsField(pojo, jgen, provider); 
      } 

     } 

    }; 

    JsonPojo jsonPojo = new JsonPojo(); 
    jsonPojo.setStrVal("Hello World"); 
    jsonPojo.setIntVal(0); 
    try { 
     ObjectMapper mapper = new ObjectMapper(); 
     FilterProvider filters = new SimpleFilterProvider().addFilter("theFilter", theFilter); 
     mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false); 
     String json = mapper.writer(filters).writeValueAsString(jsonPojo); 
     System.out.println(json); 
    } catch (Exception e) { 

    } 
} 
+0

我更新了問題。其實我的意思是,如果沒有設置intVal,那麼只有在設置後纔會忽略,然後將其包含在json輸出中。 – tuk