遇到一个json解码失败的问题

Posted 叫我星宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇到一个json解码失败的问题相关的知识,希望对你有一定的参考价值。

今日批量导入游戏, 从别人接口拉去的字符串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解码失败的问题的主要内容,如果未能解决你的问题,请参考以下文章

json解码失败

Json解码失败?

解码 json 无法打开流:HTTP 请求失败!错误

Swift解码字符串JSON失败

使用 Arduino 解码较大的 DES 数据失败

我如何很好地解码Laravel失败的工作JSON