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對象的算法,因此錯誤也可能略有不同。這就是你得到不同結果的原因,這沒關系。
添加回答
舉報