JsonNode isTextual()莫名其妙地返回false

时间:2015-05-18 23:02:45

标签: java json jackson

我在Java中有一个Jetty WebSocket服务器,它接受JSON格式的传入消息并执行简单的解析。这是通过使用Jackson databind library将传入消息转换为JsonNode对象来完成的。我正在尝试验证一些数据字段,但我对isTextual()有一个令人困惑的问题。我已将其归结为最小的测试,但仍然无法弄明白。

这基本上就是我所拥有的:

// sample JSON: {...,"key":"de305d54","topic":"de305d54"}
// action is another JsonNode that contains the "topic" and "key" fields
final JsonNode actionKey = validateKey(action.get("key"));
final JsonNode actionTopic = validateTopic(action.get("topic"));

// both validation functions perform the same check
private JsonNode validateKey(JsonNode key) throws Exception {
    if (!key.isTextual())
        throw new Exception("invalid key");
    return key;
}
private JsonNode validateTopic(JsonNode topic) throws Exception {
    if (!topic.isTextual())
        throw new Exception("invalid topic");
    return topic;
}

问题是始终会抛出java.lang.Exception: invalid topic

对于它的地狱,这是打印JSON值的结果:

System.out.println("topic is: " + action.get("topic"));
System.out.println("key is: " + action.get("key"));

// topic is: "de305d54"
// key is: "de305d54"

还有一个奇怪的证据:根据the JsonNode docs,如果值不是textValue(),则String调用 NOT 会进行任何类型转换它将返回null。但是textValue()的结果会打印一个字符串。

System.out.println(action.get("topic").textValue());
// de305d54

1 个答案:

答案 0 :(得分:1)

来自jackson docs:

  

public boolean isBinary():可用于检查是否存在的方法   node表示二进制数据(Base64编码)。虽然这样会   外部写为Json String值,isTextual()将返回false   如果此方法返回true。

您的数据外观,如Base64编码。我怀疑这可能是为什么isTextual()返回false。