今天同事突然和我说,腾讯微博无法访问了。但新浪微博接口却是正常的。
打开指定的URL,发现报错,仔细看了一下代码,居然是
if(!is_array($jsonDecode)){
throw new Exception("xxxx");
}
当发现json解析出来不是数组的时候,直接抛出异常。
可是我把json字符串在decode前输出的时候是正常的,那是为什么呢?为什么我var_dump出来是null?
看了一下手册,居然说var_dump出来null的原因是因为deepth不够,但看了一下手册,好象也就三个取值范围,128,512,1024,于是我设为最大的1024,但仍然失败。
然后,突然发现,居然json_decode有第四个参数,把BIGINT当成字符串。以为是这个问题导致的,兴冲冲的把这个参数加上去,结果报错,看了一下手册,原来这个参数居然是PHP 5.4才有的。。。
----
再测试,把文本拷成字符串,运行json_decode,居然正常了。这时候我就纳闷了。为什么直接处理不正常。拷成字符串就正常了。
仔细检查。居然发现里面有中文被截断的字符串。晶,肯定是这个原因了。。。
于是写正则,把这玩意替换掉,把A\d{3};的字符串都替换成空格。然后再反处理回去。。结果仍然失败,这时候我就在想一个问题,为什么会有这种情况?
最终我确定,绝对是编码,一定是那个不正常的字符串导致了原来的json字符串被错误的识别成了ISO-8900-1,所以我啥也没处理,直接把json字符串mb_convert_encoding($str,"UTF-8","auto"),自动转换成utf-8,果然json_decode,顺利的转换成了数组。
---
纠结了一天的事情,居然就是这样的小,所幸解决了。