fastjson JSONValidator 的使用记录,判断一个字符串是否是正确的json格式

在api的对接过程中,对方api总是会返回一些意想不到的格式回来, 虽然你们已经约定好了使用json的方式返回 !!

我以为的 判断接口返回的结果是否是json格式

if (!JSONValidator.from(result).validate()) {
    return "结果非json格式";
}

 

这样看起来似乎没有问题,直到今天偶然看到某个 api接口 返回的结果为 false;

然后通过了 上面的验证!!!

然后通过了 上面的验证!!!

然后通过了 上面的验证!!!

通过验证后,在执行下面反序列化代码时抛出了异常

JSONObject.parseObject(send.toString(), XXX.class);

 

问题的重点  为什么 JSONValidator.from("false").validate() == true

问题的重点  为什么 JSONValidator.from("false").validate() == true

问题的重点  为什么 JSONValidator.from("false").validate() == true

 

经过查阅资料得知,之前 对JSONValidator.from("false").validate() 有误解  
我之前理解的这段代码的含义是  判断这个字符串是否是正确的json格式

但是  事实上:

意思是  判断这个字符串是否是json 的格式 或json的 values的 格式

 

啥意思呢  简单的理解就是 json 有6中数据类型

出自: rfc-editor.org/rfc/rfc8259.txt

符合 false null true object array number string 类型的都可以校验通过

 

借用网上的截图

 

JSONValidator.from(result).validate() 这里的result 符合json格式或者 json的values的数据格式 都是会返回true的  以后使用的是时候要注意了!!!

 

 

分割线-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线

那么问题来了, 我们应该如何校验一个字符串是否是可以正确序列化的字符串呢?

先给一个比较暴力的方法

try {
        JSONObject o = new JSONObject(yourString);
    } catch (JSONException e) {
        LOGGER.error("No valid json");
    }

 

方法2:

Object json = new cn.hutool.json.JSONTokener("[{\"name\":\"test\"}]").nextValue();
        if (json instanceof cn.hutool.json.JSONObject || json instanceof cn.hutool.json.JSONArray) {
            System.out.println(true);
        } else {
            System.out.println(false);
        }
posted @ 2023-10-17 16:30  loveCrane  阅读(4187)  评论(0编辑  收藏  举报