现在开发接口大多数都是使用的是post一个json字符串过来,然后后端服务进行解析这个json然后做相应的处理,由于接口是开放出去的,调用方使用各种各样的语言来实现,在次就遇到调用方确实post过来一个json字符串,而php就是死活都没有进行对应得业务处理。
进过一番调试后发现在json_decode这块有时就是解析出了个NULL,为什么会出现这样呢,原因有如下几个:
- 原字符串中包含非UTF-8编码的字符
- 最后元素有逗号
- 使用单引号
- 包含\t、\t等特殊字符
调用方使用程序进行json编码成字符串的,可以确定2跟3是不可能出现的,那么1跟4是可能出现的,在此可以采用str_replace进行对这些字符替换从而来达到目的,但是这样会丢失部分内容,这不是一个好办法,但是确实是可行的办法,下面要介绍的是另一种方法,既可以保证内容不丢失,又可以保证可以解析,这个方法就是利用php自身带的json_encode,原理就是把里面的非UTF-8编码的字符和\t、\n等特殊字符进行转换,非UTF-8的转换成unicode,特殊字符追加转义符。
实现代码如下:
<?php $str = file_get_contents("php://input"); $str = substr(str_replace('\"', '"', json_encode($str)), 1, -1); //在此就对特殊字符进行了编码 $arr = json_decode($str, TRUE);
采用以上代码就可以完美的解决上述的问题,如有2或3的话,就只能叫调用方更改json库了,嘿嘿!