当前FASTJSON的合法性校验需要通过JSON.parse来实现,这样需要完整把JSON的结构Parse出来,性能不是最优。需要提供一个新的API,只做JSON合法性校验,支持UTF-8 Bytes和String两种输入,快速校验JSON数据的合法性。
[alibaba/fastjson]提供高性能JSON合法性校验API
回答
parse能解析一些不合规范的json,建议校验合法性的api应提供比parse更严格的校验规则,当然这点能作为参数决定是否开启就更好了。因为单独使用校验api有两种可能的场景,一种是接下来继续交给fastjson解析,自然是只要可以解析,就应该能通过合法性检验,但另一种可能是交给其他框架,甚至浏览器来解析,这时就需要更严格的校验标准来提供可移植性。
hi 支持 json schema validator嘛,目前
JSON数据格式具有对称性。我的第一想法是用栈进行括号的匹配。但是题目中说,把JSON结构完全解析出来效率不高,不知道我说的这种方法是不是符合要求
@wenzhi666 当然有区别,一般解析包含大量new对象和反射之类的操作,验证合法性则仅仅是解析字符串,不考虑性能上的提升(个人觉得应该也不会有太显而易见的提升),但解析字符串本身可以做到几乎不消耗内存,也就是说可以验证非常庞大的json字符串或者更进一步的json流,而不用消耗与之相对的巨量内存。
@vipcxj 确实没有说的这么简单,括号和双引号不匹配只是JSON非法的一种情况而已。对于name/value,还有name必须被双引,value前必须有: 、多组name/value间必须有逗号隔开等等。于是我想到,对于不同类型检测的要求不同,就类似于“状态机”。 使用两个栈s1,s2。s1用于对称符号检测,如{},[],"" s2用于记录当前处于有序序列(order)还是无序序列(unorder) 考虑到无序序列中的检测又分为检测name,检测value;且有序序列中也有value。用test表示,分别有: nv_name,nv_value,ordervalue,nv_empty(考虑到 {} 中的内容可能为空) 对于 [ { “ID”:[123,456] } , 1]这样一个JSON 第一个字符为 [ ,将其入栈s1,s2.push(order),test=ordervalue 从第二个字符开始循环读取,进入ordervalue对应的检测代码,由于字符为 { ,将该字符入s1,s2.push(unoeder),test = nv_empty 下一个字符为 “ ,进入nv_empty对应的检测,s1.push("),test = nv_name ......依次类推 当检测到 } 时,因为s1.top()和 } 匹配,故s1.pop(),s2.pop(),之后s2.top() == order,test = ordervalue ...... 检测到 ] 时,与上面类似,s1.pop(),s2.pop() ,此时循环结束 对于一个正确的JSON字符串,结束检测后s1和s2必然都为空,不都为空则是非法的 以上检测中包含了 : , 以及name双引号包含等,为了说明大致逻辑没有描述
以上就是我的想法,希望您能给些建议。
- 状态机的思路是可以行的
- 基于utf bytes的实现,直接基于bytes操作,不生成String对象。
- 基于String的实现,功能和基于utf8一样。
- 校验过程中不需要把String/int的值读取来,不错生成Key和Value的对象,只校验合法性,不生成之对象
- 尽量考虑代码是否被使用到jit后的代码是否用到vector实现,比如AVX 512指令等。
您好,我实现了一个简单的状态机,并提交了pr, 对AsoC非常感兴趣。 我是大四学生,现在一个投行做实习,是java后端。 由于得知项目时间过晚,我周末才开始准备。 申请和项目计划会尽快发给您 linkdin: https://www.linkedin.com/in/yunfei-zhao/ PR:https://github.com/alibaba/fastjson/pull/2476 然后我pr是不是到master 好一些? 然后报名的话就是将plan书发到您邮箱? 很希望这个假期在您的指导下为社区做贡献并提升自己的水平 @wenshao
@wenshao @vipcxj 你好,我刚才提交了提案。但是没有收到邮件确认或者短信。虽然显示了表单提交成功,但是不确定是不是成功了。
@wenzhi666 你好,打扰一下,请问你是在哪里提交的档案呢?我只是通过提供的邮箱发了一份申请,没有得到确认,也没有提交显示。 @wenshao @vipcxj 也希望mentors 给我们提供一些信息。谢谢啦
@YunfeiZHAO 申请的话是官方给出了一个网站,你说的邮件是在哪里?
@wenzhi666 aliopensource@alibabacloud.com
今天似乎就要出结果了,大家有没有收到结果呢?