2013-09-16 53 views
4

我使用Jackson Json Mapper來解析我的服務器上的查詢。Jackson Json Mapper:無字段或空字段?

例如,我在等待查詢其適合My_class類:

class My_class { 
    String a; 
    String b; 
} 

我反序列化查詢,這種方式:

public <T> T Deserialize(String json, Class<T> type) throws DeserializationException { 
     if (json == null || type == null) { 
      throw new IllegalArgumentException(); 
     } 
     try { 
      return objectMapper.readValue(json, type); 
     } catch (JsonParseException e) { 
      throw new DeserializationException(e); 
     } catch (org.codehaus.jackson.map.JsonMappingException e) { 
      throw new DeserializationException(e); 
     } catch (IOException e) { 
      throw new DeserializationException(e); 
     } 
    } 

這裏有兩個例子查詢:

{"a":"test"} 
{"a":"test", "b":null} 

問題是我想知道用戶只給我一個查詢字段a,當他發送一個查詢字段b設置爲null。在兩種情況下,映射器將字段b標記爲null

什麼是更好的方法來做到這一點(並避免編寫我自己的解串器)?

+2

這兩種情況有什麼區別? – 2013-09-16 12:45:41

+0

在這兩種情況下,你會期望傑克遜如何映射'b'的值?在Java中,My_class有一個名爲'b'的字段,它只能有一個字符串值或爲空。因此,當B不存在於JSON有效載荷中時,您希望My_class'b'字段具有什麼值?如果JSON有效載荷中的「b」爲空,該怎麼辦? – Kyle

回答

6

每個JsonNode都有方法isNull()。您可以使用它來檢查值是否爲空文字。

可用於檢查此節點是否從JSON文本空值創建的方法。

還有isMissingNode(),這似乎也有類似的目的。如果節點實際上不在json中,它應該返回true。如果您爲屬性設置了任何默認值,則應該使用它。

對於「虛擬」節點返回true的方法,該節點表示由沒有實際節點匹配給定條件的路徑訪問器方法構造的缺失條目。


你不應該建的東西,取決於這雖然。通過這樣做,您可以爲反序列化的json添加某種附加數據類型:而不是僅僅'null',您有'null literal'和'missing'這是不常見的做法。這很令人困惑,它可能會導致您的API出現問題,因爲客戶端需要做額外的工作來配置它的序列化程序來區分這兩種狀態。並不是每一個實現都有這個能力。

+0

謝謝你,kapep,爲你提供幫助。我很感激。 – liptonshmidt