php的json_decode函数用来解析json数据很方便,但是有时候却解析不了。
究其原因找到如下可能性:
1.键名没有用双引号括起来
['name':n,'age',a]
[name:n,age,a]
这两个都不能解析
2.出现多余逗号
['name':n,'age',a,]
###3.有些转义不支持
数据中出现\x26这样的会失败,有时候\'都无法解析。
用stripslashes()去掉转义即可!
4.json不支持gbk编码
iconv('GBK', 'UTF-8', $json_data);//使用iconv()函数将GBK转到UTF-8编码
json数据解析前用检测工具测试一下较好:http://www.bejson.com/
150515添加
/*
格式化错误的json数据,使其能被json_decode()解析
不支持健名有中文、引号、花括号、冒号
不支持健指有冒号
*/
function format_ErrorJson($data,$quotes_key=false)
{
$con = str_replace('\'','"',$data);//替换单引号为双引号
$con = str_replace(array('\\"'),array('<|YH|>'),$con);//替换
$con = preg_replace('/(\w+):[ {]?((?<YinHao>"?).*?\k<YinHao>[,}]?)/is', '"$1": $2',$con );//若键名没有双引号则添加
if($quotes_key)
{
$con = preg_replace('/("\w+"): ?([^"\s]+)([,}])[\s]?/is', '$1: "$2"$3',$con );//给键值添加双引号
}
$con = str_replace(array('<|YH|>'),array('\\"'),$con);//还原替换
return $con;
}
参考:http://bbs.csdn.net/topics/390496037
http://chenwei.me/p/59.html