来自:mjsws > 馆藏分类
配色: 字号:
php下的json字符串转化讲解
2018-06-25 | 阅:  转:  |  分享 
  
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);
献花(0)
+1
(本文系mjsws首藏)