2 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
JSON 解析器僅讀取輸入的第一個(gè)根值。
例如,對(duì)于以下 JSON 文本,只會(huì)foo解析第一個(gè)帶有字段的對(duì)象,然后解析停止,因此它看不到其余的內(nèi)容,其余的內(nèi)容可以是任何內(nèi)容。
{
"foo": 42
}
{
"bar": 666
}
要驗(yàn)證 JSON 文本并驗(yàn)證不存在額外內(nèi)容,您可以使用底層 Jackson 解析器,而不是高級(jí)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")));
最后一個(gè)是讀取問題中包含 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貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
當(dāng)你說你測試過的所有庫(jackson、gson 等)都有相同的結(jié)果時(shí),你到底是什么意思?相同的錯(cuò)誤消息、相同的異常類、相同的堆棧跟蹤?請將檢查結(jié)果發(fā)布在問題中,以便我們的同事提供更好的答案。
當(dāng)您調(diào)用問題中提到的站點(diǎn)時(shí),沒有人保證在后端您的示例 json 會(huì)由您測試過的庫之一處理,甚至沒有人保證該站點(diǎn)的后端是用Java/任何 JVM 語言,因此這些站點(diǎn)的開發(fā)人員甚至可能無法訪問這些 json 庫。
不管怎樣,每個(gè)基于或不基于java的庫都有自己的解析json對(duì)象的算法,因此錯(cuò)誤也可能略有不同。這就是你得到不同結(jié)果的原因,這沒關(guān)系。
添加回答
舉報(bào)