发布时间:2016-12-19 18:13:55编辑:丝画阁阅读(308)
问题:用PHP读取文件中的json数据,怎么解析都是返回null。
1
|
{"a":1,"b":2,"x":[{"c":3},{"d":4},{"e":5}]}
|
读取文件,使用了file_get_contents函数。
1
2
3
4
|
$json='{"a":1,"b":2,"x":[{"c":3},{"d":4},{"e":5}]}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
|
如果直接在php中读取json字符串,是没有错的,怎么从文件读取就错了呢。
php5.2以后自带json_decode函数,但是对json文本串的格式要求非常严格。
很可能使用该函数得到的返回值是NULL
使用json_last_error()函数获取到的返回值是JSON_ERROR_SYNTAX(Syntax error)。
可以通过以下几个方式排错。
1
|
$output=str_replace("'", '"',$output);
|
1
|
$output= iconv('gbk','utf8',$output);
|
1
|
preg_replace('/,\s*([\]}])/m','$1',$output)
|
1
|
header("Content-Type: text/html; charset=UTF-8");
|
造成json_decode() 解析null的原因关键结果在是,
修正后代码如下,即可正常解析
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$dmText=file_get_contents( AROOT .'data'. DS .'DMType.json.php');
if(preg_match('/^\xEF\xBB\xBF/',$dmText))
{
$dmText=substr($dmText,3);
}
//trim
$dmText= t($dmText);
echo$dmText;
/* create array list from comments */
$dmList= json_decode($dmText,true); //当该参数为 TRUE 时,将返回 array 而非 object 。
var_dump($dmList);
|
显示结果:
View Code { "success": "true", "total":"4", "items": [ {"id":"1","c":"asdaEG","tb": "dm_suppliertype", "cn": "供应商类型","tips":"供应商类型"}, {"id":"2","c":"adsafR","tb": "suppliertype2", "cn": "供应商类型2","tips":"供应商类型"}, {"id":"3","c":"ada222","tb": "suppliertype3", "cn": "供应商类型3","tips":"供应商类型"}, {"id":"4","c":"23jetG","tb": "suppliertype4", "cn": "供应商类型4","tips":"供应商类型"} ] }array(3) { ["success"]=> string(4) "true" ["total"]=> string(1) "4" ["items"]=> array(4) { [0]=> array(5) { ["id"]=> string(1) "1" ["c"]=> string(6) "asdaEG" ["tb"]=> string(15) "dm_suppliertype" ["cn"]=> string(15) "供应商类型" ["tips"]=> string(15) "供应商类型" } [1]=> array(5) { ["id"]=> string(1) "2" ["c"]=> string(6) "adsafR" ["tb"]=> string(13) "suppliertype2" ["cn"]=> string(16) "供应商类型2" ["tips"]=> string(15) "供应商类型" } [2]=> array(5) { ["id"]=> string(1) "3" ["c"]=> string(6) "ada222" ["tb"]=> string(13) "suppliertype3" ["cn"]=> string(16) "供应商类型3" ["tips"]=> string(15) "供应商类型" } [3]=> array(5) { ["id"]=> string(1) "4" ["c"]=> string(6) "23jetG" ["tb"]=> string(13) "suppliertype4" ["cn"]=> string(16) "供应商类型4" ["tips"]=> string(15) "供应商类型" } } }
PHP5中的file_get_contents函数获取文件内容,实际是按二进制来读取的,所以,当你用file_get_contents去获取一个带BOM的UTF-8文件时,它并不会把UTF-8的BOM去掉,当你把读取的内容当作文本内容来进行一些操作时,可能会发生一些意想不到的结果。
这并不能算作一个BUG,因为file_get_contents函数读取文件的时候,是按二进制来读取的,读取到的内容是包含BOM的,而用户操作的时候,想当然的以为读取到的内容是不包含BOM的文本内容(如用记事本打开后看到的内容),因为BOM在编辑软件中是不可见的,只有在十六进制模式下才可以看见,问题也就出在这,实际上是由于“操作不统一”造成的。
当对UTF-8编码的文件进行操作时,如果要把读取的内容当作文本内容来处理,最好先对BOM进行一些处理,这个问题在PHP6中得到了解决(可以设置文本/二进制读取模式),有兴趣的朋友可以自己查找PHP6的手册。
一个较简单的解决方法:
1
2
3
4
5
6
7
8
|
Copyright © 2017-2020, www.homeforexchange.cn. All Rights Reserved. |
©渝ICP备15012122号-1
本站部分内容来源网络及网友上传,本站未必能一一鉴别其是否为公共版权或其版权归属,如果您认为侵犯您的权利,本站将表示非常抱歉! |