验证字符串JSON java库与联机-不同的结果
我有一个用java验证字符串json的方法 我尝试了最好的库,比如JsonSimple、gson和jackson。它们都有相同的结果,json字符串是有效的,下面的代码是我的jackson验证方法验证字符串JSON java库与联机-不同的结果,java,json,Java,Json,我有一个用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); }
//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的在线站点对我的代码有相同的结果
我在这些网站上检查了我的字符串
{
"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"
当你说你测试过的所有库(jackson、gson等)都有相同的结果时,你到底是什么意思?相同的错误消息,相同的异常类,相同的堆栈跟踪?请在问题中张贴检查结果,以便我们的同事提供更好的答案 当您调用问题中提到的站点时,没有人保证在后端您的示例json会被您测试过的库之一处理,甚至没有人保证站点的后端是用Java/任何JVM语言编写的,因此这些json库甚至可能无法供这些站点的开发人员访问
无论如何,每个基于java或不基于java的库都有自己的解析json对象的算法,因此错误也可能略有不同。这就是产生不同结果的原因,这是正常的。JSON解析器只读取输入的第一个根值 例如,对于以下JSON文本,只有第一个字段为
foo
的对象将被解析,然后解析停止,因此它看不到其余的对象,其余的对象可以是任何内容
{
“福”:42
}
{
“酒吧”: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());
}
}
}
试验
最后一个是从问题中读取带有JSON的文件
输出
无效:java.io.IOException:没有JSON根元素
有效的
有效的
无效:java.io.IOException:第4行第1列有多个JSON根元素
无效:java.io.IOException:第29行第4列有多个JSON根元素
我的意思是,所有站点都有相同的错误“Multiple JSON root elements error”,但所有库返回的JSON都是有效的
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")));