首先,楼主在写接口的时候,是用laravel查询数据库,然后对返回的结果进行:json_decode(json_encode($ret),true)
,,本以为能顺利的转化为json字符串输出的,结果却发现结果为null,因此记录一下。
一、json_decode($str,true)的结果为null
1、原因:
(1)$str只能UTF-8编码
(2)元素最后不能有逗号(与php的array不同)
(3)元素不能使用单引号
(4)元素值中间不能有空格和n,必须替换
2、解决方案:
$data = stripslashes(html_entity_decode($info));
//$info是传递过来的json字符串
$data = json_decode($data,TRUE);
//这时候$data就是解析后的数组了!
//html_entity_decode() 函数的作用是把 HTML 实体转换为字符。
//stripslashes() 函数的作用是删除反斜杠。
二、js_encode的结果为false
1、是的,在我排除json_decode为null的问题之后,我发现我的json_encode的结果竟然为false,很无奈,百度了一下,人家说主要原因就是字符格式的问题。php的json_encode($str)里面的str只能是UTF-8格式的。
2、解决方案:
function array_iconv($in_charset,$out_charset,$arr){
return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';'));
}
网上找的代码是这个,但需要因大家的实际业务来写,比如我的$arr是个数组对象,而且用eval之后一直报错,所以我就直接改了下:
$ret =iconv('GBK','UTF-8//IGNORE',var_export($arr,true));
return MyResponse::success(json_decode(json_encode($ret),true),200);
这样就OK了,成功的输出了json字符串
三、遇到的问题:
1、PHP的iconv()函数遇到的错误: Detected an illegal character in input string …
原因:你要转换的数组中含有iconv()函数不认识的字符,可能是繁体字,也可能是反斜杠等。
解决方案:
(1) 扩大输出字符编码的范围,如把GBK2312改为GBK.
(2) 在输出的字符编码字符串后面加上”//IGNORE”,如iconv(‘GBK’,’UTF-8//IGNORE’,var_export($arr,true)),这样做其实是忽略了不能转换的字符,避免了出错但却不能够正确地输出(即空白不、输出)。
2、 eval()’d code line 3:
解决方案:
(1)查看你的代码,要知道eval()里面输出的必须是符合php规范的,也就是逗号,分号,一个都不能少
(2)注意有没有漏掉反斜杠,如:
eval("if ($strif) {\$ifFlag=true;}else{\$ifFlag=false;}");
eval("if (\$strif) {\$ifFlag=true;}else{\$ifFlag=false;}");
上面的因为少个反斜杠,所以报错了。。
end