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);
}