猿问

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

我有一个在java中验证字符串json的方法。


我尝试了最好的库,如 JsonSimple、gson 和 jackson。所有这些都有相同的结果,即 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 的在线网站对我的代码有相同的结果。

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

  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"


慕姐8265434
浏览 86回答 2
2回答

有只小跳蛙

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 elementValidValidInvalid: java.io.IOException: Multiple JSON root elements at line 4, column 1Invalid: java.io.IOException: Multiple JSON root elements at line 29, column 4

暮色呼如

当你说你测试过的所有库(jackson、gson 等)都有相同的结果时,你到底是什么意思?相同的错误消息、相同的异常类、相同的堆栈跟踪?请将检查结果发布在问题中,以便我们的同事提供更好的答案。当您调用问题中提到的站点时,没有人保证在后端您的示例 json 会由您测试过的库之一处理,甚至没有人保证该站点的后端是用Java/任何 JVM 语言,因此这些站点的开发人员甚至可能无法访问这些 json 库。不管怎样,每个基于或不基于java的库都有自己的解析json对象的算法,因此错误也可能略有不同。这就是你得到不同结果的原因,这没关系。
随时随地看视频慕课网APP

相关分类

Java
我要回答