2 回答
TA贡献1824条经验 获得超8个赞
JSON 解析器仅读取输入的第一个根值。
例如,对于以下 JSON 文本,只会foo解析第一个带有字段的对象,然后解析停止,因此它看不到其余的内容,其余的内容可以是任何内容。
{
"foo": 42
}
{
"bar": 666
}
要验证 JSON 文本并验证不存在额外内容,您可以使用底层 Jackson 解析器,而不是高级ObjectMapper.
public static void validateJSON(String json) throws IOException {
JsonFactory jsonFactory = new JsonFactory();
try (JsonParser jsonParser = jsonFactory.createParser(json)) {
if (jsonParser.nextToken() == null)
throw new IOException("No JSON root element");
if (jsonParser.skipChildren().nextToken() != null) {
JsonLocation loc = jsonParser.getTokenLocation();
throw new IOException("Multiple JSON root elements" +
" at line " + loc.getLineNr() +
", column " + loc.getColumnNr());
}
}
}
测试
public static void test(String json) {
try {
validateJSON(json);
System.out.println("Valid");
} catch (Exception e) {
System.out.println("Invalid: " + e);
}
}
test("");
test("{}");
test("{ \"foo\": 42 }");
test("{\n" +
" \"foo\": 42\n" +
"}\n" +
"{\n" +
" \"bar\": 666\n" +
"}");
test(Files.readString(Paths.get("test.json")));
最后一个是读取问题中包含 JSON 的文件。
输出
Invalid: java.io.IOException: No JSON root element
Valid
Valid
Invalid: java.io.IOException: Multiple JSON root elements at line 4, column 1
Invalid: java.io.IOException: Multiple JSON root elements at line 29, column 4
TA贡献1853条经验 获得超9个赞
当你说你测试过的所有库(jackson、gson 等)都有相同的结果时,你到底是什么意思?相同的错误消息、相同的异常类、相同的堆栈跟踪?请将检查结果发布在问题中,以便我们的同事提供更好的答案。
当您调用问题中提到的站点时,没有人保证在后端您的示例 json 会由您测试过的库之一处理,甚至没有人保证该站点的后端是用Java/任何 JVM 语言,因此这些站点的开发人员甚至可能无法访问这些 json 库。
不管怎样,每个基于或不基于java的库都有自己的解析json对象的算法,因此错误也可能略有不同。这就是你得到不同结果的原因,这没关系。
添加回答
举报