json_decode解码失败.

案例:
今日批量导入游戏, 从别人接口拉去的字符串json_decode总是失败, 但是把log里面记录的解码失败的字符串copy出来单独解析,却可以成功. 排除了是字符编码的问题后, 还是不行, 百思不得其解.

只好二进制对比, 把接收到buf和我打印到log对比, 发现还真存在一些差异

分析:
一个一个字节对比, 发现从第373个字节开始不匹配. 一个是9=>\t, 一个是32对应空格.
373 not equal, org:9    , new:32 , 原来, 如果字符串中含有\t字符, 就会解码失败.

而我log里面记录的字符串, 我在copy字符串到其他地方解析时, \t自动被转换为了空格. 怪不得.

总结:
json 编解码 json_decode json_encode失败
1) 对于php json_decode失败, 原因可能是
  a) 输入的字符串不是utf-8的, 可以用 mb_detect_encoding 检测出字符串的编码类型.  
     解决:如果不是utf-8, 可以使用iconv转换. utf8_encode函数慎用! 其总是认为输入字符串为ISO-8859-1编码的!!.
  b) 输入字符串中含有 \t回车等隐藏的不可见字符.
     eg对于如下字符串会解码失败:
     $str = "{\"ret\t\": 0}";  去掉\t则可以解码成功
     解决: $str = strtr($str, "\t", ' '); 把\t都替换成空格.

你可能感兴趣的:(json_decode解码失败.)