天天看点

json格式校验(json格式校验器)

如何识别一个字符串是否Json格式
 ScriptEngineManager sem = newScriptEngineManager();
ScriptEngine se = sem.getEngineByName("js");
String jsonstr = " \r\n  [{}]";
if(!jsonstr.matches("^[\r\n\f\t\\x20]*[\\{\\[][\\s\\S]*")) {
thrownewScriptException("");
}
se.eval(jsonstr);
System.out.println("是json格式");
} catch(ScriptException e) {
System.out.println("json格式有误");
}json需要分析的情况,比想象的要多,举一个不太简单的json:
[1,{"a":2},\r\n{"a"www.hbbz08.com :{}}, {"a":[]},{"a":[{}]},{"{[a":"\"2,:3,"a":33}]"}]
从上面这个json中,就可以看出需要分析的有:
1:数组和json数组。 
2:键与值(无引号、双引号)的识别
3:无限级值嵌套(数组嵌套、json嵌套)
4:7个关键符号[{,:"}]。
5:转义符号、空格、换行、回车处理。 
回顾早些年写的jsonhelper
还记得cyq.data里jsonhelper的最初版本,仅处理了只有一级json的简单情况,那时候分析json就靠以下两种方法:
1:split 分隔。
2:循环 indexof 识别。
虽然偷工减料,投机取巧,但只要限定使用环境和条件、好在够用,也够简单。
当然了,现在情况变了,把限定的环境和条件去除后,事实上,要分析起来就没那么简单了。
故事一开始,思考了三天三夜
由于放开了条件,需要考虑无限级递归的,于是看似split和indexof这种方式已经不奏效了。
字符串的分析方法看似需要改朝换代了,但我仍给split和indexof寻求最后的机会。
经过层层思考与分析,发经没折了,只有祭出终极必杀招了。
终极大招:遍历字符,记录状态 
一个万能的解决方法,就是遍历每个字符,然后记录这个字符前后左右上下东南西北中发白各种状态,再根据状态来识别下一个字符的动作。
1:首先有一个记录字符状态的类,如下图:
这个字符状态的记录类,我前后不断调整了n天,才终于感觉好像ok了。 
2:接下来是字符的状态设置,根据不同的关键字,设置状态,如下图:
这是个漫长不断调试的过程,很折腾人。
3:一个可以不断递归json的函数,如下图:
4:一个可以识别语法错误的函数:
5:最后是一个给外部的调用方法:
如何校验 JSON 数据
先提供两个在线校验JSON工具给您;
如果是程序校验,我们可以采用这种方式,都可以采用转换的方式,如Java
//这里把JSON字符串转换为JSON对象,如果成功,就是正确的。
}cache(Exception e){
//如果进来了,就JSON格式不正确
}方法一:
用jsonobject.fromobject(str),如果异常说明其格式错误。这个方法够粗暴狂野,但是,不能有针对性的校验json。
在每一个接口里去解析json,一层一层、一个一个的校验是否是规定的参数格式。这个方法肯定没问题,但是,懒惰的程序员应该不会这样做的。
在配置文件或数据库里规定一个配置,通过不同的配置去解析不同的json,符合配置则正确,反之则错误。