亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

驗證字符串 JSON java 庫與在線 - 不同的結果

驗證字符串 JSON java 庫與在線 - 不同的結果

慕姐8265434 2024-01-25 21:11:17
我有一個在java中驗證字符串json的方法。我嘗試了最好的庫,如 JsonSimple、gson 和 jackson。所有這些都有相同的結果,即 json 字符串有效,下面的代碼是我的杰克遜驗證方法。//jackson libpublic 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.comjsonlint.comjsonformatter.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": "[email protected]",     "fullAddress": "CHINA",     "tags": [],     "tagTrees": [],     "active": false,     "apiToken": "0a4a31d1fe5c457785145fe7f97bc26e",     "numOfLike": 0,     "numOfDislike": 0,     "username": "pos_psp"   } } "id": 3552, "userId": 1357729 "username": "pos_psp"
查看完整描述

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


查看完整回答
反對 回復 2024-01-25
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

當你說你測試過的所有庫(jackson、gson 等)都有相同的結果時,你到底是什么意思?相同的錯誤消息、相同的異常類、相同的堆棧跟蹤?請將檢查結果發布在問題中,以便我們的同事提供更好的答案。

當您調用問題中提到的站點時,沒有人保證在后端您的示例 json 會由您測試過的庫之一處理,甚至沒有人保證該站點的后端是用Java/任何 JVM 語言,因此這些站點的開發人員甚至可能無法訪問這些 json 庫。

不管怎樣,每個基于或不基于java的庫都有自己的解析json對象的算法,因此錯誤也可能略有不同。這就是你得到不同結果的原因,這沒關系。


查看完整回答
反對 回復 2024-01-25
  • 2 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號