我在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
答案 0 :(得分:1)
来自jackson docs:
public boolean isBinary():可用于检查是否存在的方法 node表示二进制数据(Base64编码)。虽然这样会 外部写为Json String值,isTextual()将返回false 如果此方法返回true。
您的数据外观,如Base64编码。我怀疑这可能是为什么isTextual()返回false。