java - 验证字符串 JSON java 库与在线 - 不同的结果

标签 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);

} catch(JsonProcessingException e){
 valid = false;
}

return valid;
}

我希望验证 json 的在线网站对我的代码有相同的结果。

我在这些网站中检查了我的字符串

  1. jsonformatter.curiousconcept.com

  2. jsonlint.com

  3. 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/

相关文章:

java - Eratosthenes 筛法认为所有数在 127 之后都是质数

python - PySpark - 如何输出具有特定字段的 JSON?

javascript - facebook graph api ajax XMLHttpRequest - 空结果?

javascript - 如何在 Extjs 中使用网格显示 JSON 数据

java - 更改Gradle Project的文件夹结构时,线程 “main” java.lang.ExceptionInInitializerError中的异常

java - 如果返回类型为 java.sql.Timestamp,则基于接口(interface)的投影 getter 方法给出异常

java - Android Intent启动时获取GPS

java - 我找不到 javaC.sublime-build

javascript - 将记录重新插入 extJS 存储

Python flask : Getting an 'OperationalError' object is not callable when inserting to database