Jackson Json Mapper:没有场地或空地?

lip*_*idt 6 java json jackson

我使用Jackson Json Mapper来解析我的服务器上的查询.

例如,我正在等待适合类的查询My_class:

class My_class {
     String a;
     String b;
}
Run Code Online (Sandbox Code Playgroud)

我以这种方式反序列化查询:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

以下是两个示例查询:

{"a":"test"}
{"a":"test", "b":null}
Run Code Online (Sandbox Code Playgroud)

问题是我想知道用户何时向我发送仅包含该字段a的查询以及何时发送了b设置为字段的查询null.映射器,标志着场b作为null在这两种情况下.

有什么更好的方法(并避免编写自己的反序列化器)?

kap*_*pex 9

您可以使用该方法isNull()来检查它是否JsonNodenull文字.

boolean isNull()

可用于检查此节点是否是从JSON文字空值创建的方法.

还有isMissingNode(),似乎有类似的目的.如果节点实际上不存在于JSON文档中,则它应返回true.此方法很有用,例如,如果要对未明确设置的属性使用默认值.

boolean isMissingNode()

对于"虚拟"节点返回true的方法,当没有实际节点匹配给定条件时,这些节点表示由路径访问器方法构造的缺失条目.


在我看来,你应该避免构建依赖于节点null缺少节点之间的差异的东西.您实际上是在反序列化的JSON中添加了某种额外的数据类型:null在两种情况下,不仅仅是大多数JSON API返回,您现在拥有null文字缺少节点,这不是常见的做法.这很令人困惑,它可能会导致您的API出现问题,因为客户端需要做额外的工作来配置其序列化程序以区分这两种状态.可能并非所有JSON库都支持它.