2013-09-16 54 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