php下的json字符串转化讲解:解析为空今天想利用利用jQuery的ajax和服务器语言php进行交互练习瀑布流,结果在交互过程中,不知哪 一步使得php获取的字符串存在,可转为数组却是空,我天,这足足浪费我三个小时找这个bug,把每一个字符进行了一一比对,发现竟然语法 都没错!!!最后的坑竟然在BOM头,好啦,把心情回归平静,把出现的问题,尝试的方法进行总结一下:在本文中,$jsonStr代表ph p获取到的json字符串,$jsonArr代表php的json_decode()转化后的数组1.首先php中的json_decod e要求的字符串比较严格,以下几点需注意:(1)使用UTF-8编码(2)不能在最后元素有逗号(3)不能使用单引号(4)不能有\r,\ t,如果有请替换可以在https://www.bejson.com/上在线查询json格式正确与否2.如果上述几点你都做到了,但是 json_decode()的结果依然为空,尝试?1$jsonStr=?preg_replace(''/[\x00-\x1F\x8 0-\x9F]/u'','''',trim($jsonStr));以去掉其他破坏json字符串的字符。3.可能因为在json字符 串中反斜杠被转义,只需要用htmlspecialchars_decode()函数处理一下:?1$jsonStr=html specialchars_decode($jsonStr);然后再使用json_decode()函数解析得到$jsonArr4 .编码问题,尝试如下方法进行转码:(1)在保存json数据时使用urlencode()函数:?1$jsonStr=url encode(json_encode($jsonStr));解析时使用urldecode()函数:?1$jsonStr=u rldecode($jsonStr);(2)?12$jsonStr=stripslashes(html_entity_decod e($jsonStr);?$jsonArr=json_decode($jsonStr,TRUE);html_entity_de code()函数的作用是把HTML实体转换为字符。5.在转为json之前对中文进行转码:?12345678910111213 141516171819202122232425262728293031323334353637functionarrayRec ursive(&$array,$function,$apply_to_keys_also=false){?static$ recursive_counter=0;www.44771.net?if(++$recursive_counter>100 0){?die(''possibledeeprecursionattack'');?}?foreach($arrayas $key=>$value){?if(is_array($value)){?arrayRecursive($array[ $key],$function,$apply_to_keys_also);?}else{?$array[$key]=$ function($value);?}?if($apply_to_keys_also&&is_string($key)){ ?$new_key=$function($key);?if($new_key!=$key){?$array[$new_ key]=$array[$key];?unset($array[$key]);?}?}?}?$recursive_counte r--;}/ ???将数组转换为JSON字符串(兼容中文)?@param?array$array要转换的数组?@ret urnstring?????转换得到的json字符串?@accesspublic?? /functionJSON($array www.77884.net){?arrayRecursive($array,''urlencode'',true);?$json =json_encode($array);?returnurldecode($json);}echoJSON($jsonS tr);6.尝试在json_decode()的第二个参数中添加true?1$jsonArr=json_decode($jsonSt r,true)7.也是我在交互中出现的问题,不小心在返回的json字符串中返回了BOM头的不可见字符,某些编辑器默认会加上BOM头 ,如下处理才能正确解析json数据:?1$jsonArr=json_decode(trim($jsonStr,chr(239).chr(187).chr(191)),true); |
|