为了账号安全,请及时绑定邮箱和手机立即绑定

验证字符串 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": "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"
查看完整描述

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 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信