admin管理员组

文章数量:1581584

如何识别一个字符串是否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 :{}}, {"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,符合配置则正确,反之则错误。

本文标签: 格式json