我使用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
。
更好的方法是什么(并避免编写自己的反序列化器)?
答案 0 :(得分:9)
您可以使用isNull()
方法检查JsonNode
是否为null
字面值。
boolean isNull()
可用于检查此节点是否是从JSON文字空值创建的方法。
还有isMissingNode()
,似乎也有类似的目的。如果节点实际上不存在于JSON文档中,它应该返回true。这种方法很有用,例如如果要对未明确设置的属性使用默认值。
boolean isMissingNode()
为&#34;虚拟&#34;返回true的方法当没有实际节点匹配给定条件时,表示由路径访问器方法构造的缺失条目的节点。
在我看来,你应该避免构建依赖于null
和缺少节点之间差异的东西。您实际上是在反序列化的JSON中添加了某种额外的数据类型:在两种情况下,大多数JSON API都只返回null
,现在您有 null literal 和缺少节点< / em>这不是一种常见做法。这很令人困惑,它可能会导致您的API出现问题,因为客户端需要做额外的工作来配置其序列化程序以区分这两种状态。可能并非所有JSON库都支持它。