我有一个在java中验证字符串json的方法。
我尝试了最好的库,如 JsonSimple、gson 和 jackson。所有这些都有相同的结果,即 json 字符串有效,下面的代码是我的 jackson 验证方法。
//jackson lib
public static boolean isValidJSON(final String json) throws IOException {
boolean valid = true;
try{
objectMapper.readTree(json);
} catch(JsonProcessingException e){
valid = false;
}
return valid;
}
我希望验证 json 的在线网站对我的代码有相同的结果。
我在这些网站中检查了我的字符串
jsonformatter.curiousconcept.com
jsonlint.com
jsonformatter.org
注意:我的字符串 json 实际上是无效的,但我不知道为什么代码和网站结果不一样?
我的 json 字符串:
{
"hasError": false,
"referenceNumber": "57050377",
"errorCode": 0,
"count": 0,
"ott": "5cd3db66e810db0b",
"result": {
"id": 3551,
"guilds": [{
"id": 56,
"code": "TRANSPORTATION_GUILD"
}],
"subscriptionCount": 0,
"subscribed": false,
"numOfComments": 0,
"rate": {
"rate": 0,
"rateCount": 0
},
"fullAddress": "USA",
"tags": [],
"tagTrees": [],
"active": false,
"apiToken": "b9ea8244e34bb9f8d383467ad82",
"numOfLike": 0,
"numOfDislike": 0
}
}
"id": 3551,
"ssoId": "5884675",
"apiToken": "b9ea80c804e34bb9f8d383467ad82",
{
"count": 0,
"ott": "2558074f8d18f49e",
"result": {
"email": "pos_psp@ptest.land",
"fullAddress": "CHINA",
"tags": [],
"tagTrees": [],
"active": false,
"apiToken": "0a4a31d1fe5c457785145fe7f97bc26e",
"numOfLike": 0,
"numOfDislike": 0,
"username": "pos_psp"
}
}
"id": 3552,
"userId": 1357729
"username": "pos_psp"
最佳答案
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
关于java - 验证字符串 JSON java 库与在线 - 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677589/