近来在搞一个名片识别的app,在测试过程中,经常出现返回结果为空的错误。一直以为是识别不到名片的问题,纠缠了几天,突然在一天晚上注意到原来识别是没问题,问题是出现在json内容分析上。一下茅塞顿开了。痛恨醒悟得太晚了。
如下面识别到的名片内容:
{"code":"0","result":"123adikd","name":["詹建忠"],"title":["\u0000"],"mobile":["13751234632"],"tel":["4008840063","29800399","02029809322"],"degree":[],"dept":[],"comp":["广州东湖汽车"],"addr":["口:转乘经停大冲口的公空车,下车后过马路即到)","广州市荔湾区芳村大道东166号t地铁1号线A1出"],"post":[],"mBox":[],"htel":[],"fax":["02081565638"],"email":[],"web":["gzpeugeot.com"],"im":[],"numOther":[],"other":[],"extTel":[]}因为之前一直是使用JSONKit来解析json数据,鉴于它的简单高效,从一开始接触就爱上了它,并且长期的占用着,一刻也不离开。
以上数据解析出来结果为空(nil)。因为代码判断到结果为空,则提示识别错误,所以在测试过程中,有几张名片一直提示识别错误,但有另外一些名片却能识别到,所以出现了连续几天无比抓狂的痛苦。这下好了,原来症结是在json解析上。简单分析了一下json数据,觉得应该是title节点的问题,即:"title":["\u0000"]。另外写了行代码直接使用JSONKit解析这段内容,去掉引号内的\u0000后,重新运行,解析正确,内容不再为nil。狂喜了一秒后陷入了深思之中,\u0000是(char)0的Unicode编码,理论上应该是空才对,为啥JSONKit碰到这个会解析不到呢?
google之,在github上作者解释了这个问题,说这个是内容提供的错误,不符合标准的内容,所以他不认为这个是自己的错误,这个是内容提供者的问题。
作者的原话如下:
In this particular case,these services are very clearly "in the wrong".RFC 4627is unambiguous that characters <0x20
are verboten. In cases like there,where something is clearly violating the standard,my default response is that "It's the other persons (web service) problem." The standard is the standard,and it is Right(tm),even its mistakes.
详见这里:https://github.com/johnezang/JSONKit/pull/26
继续搜索,找了一篇解决办法的文章,是通过修改JSONKit代码来避开这个错误,但替换代码试了,发现不行。
文字如下:http://ixhan.com/2012/04/jsonkit-illegal-unicode-escape-sequenc/
本想试试用SBJson来解析是否能成功,但无奈网络巨慢,下载不到framework。就改成用Xcode自带的NSJSONSerialization试了下,可以解析成功的。解析出来的内容是"title": [""],也就是空字符。
试了一些在线的json解析器,上面这段json内容,解析器都可以解析成功。看来很多情况下标准和现实还是有点差距,偶尔也要为了迁就现实而要去妥协,先将标准摆一边去了,不然吃苦头的只有是自己了。看来这个道理在比较纯洁的代码世界也不能避免啊。O(∩_∩)O哈哈~