8

我使用 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。映射器将字段标记bnull两种情况。

有什么更好的方法来做到这一点(并避免编写我自己的反序列化器)?

4

1 回答 1

10

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

boolean isNull()

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

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

boolean isMissingNode()

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


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

于 2013-09-16T12:54:10.593 回答