為什么php的json_decode()函數(shù)解析這個json字符串時返回NULL而不是預(yù)期的數(shù)組?
在使用php解析json字符串時,有時候會遇到j(luò)son_decode()函數(shù)返回null的情況。根據(jù)提供的代碼示例:
$php_input='{"key":"ao_1/f9pbbnam5_0_230502100035.mp3","fname":"ao_1/f9pbbnam5_0_230502100035.mp3","fsize":"234144","avinfo":"{"attachedpic":null,"audios":[{"disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"mp3 (mpeg audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}}],"maxab":96000,"subtitles":null,"videos":null,"audio":{"disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"mp3 (mpeg audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}},"format":{"bit_rate":"96000","duration":"19.512000","format_long_name":"mp2/3 (mpeg audio layer 2/3)","format_name":"mp3","nb_streams":1,"size":"234144","start_time":"0.000000","tags":{}},"subtitle":null,"video":null}","format_name":"mp3","bit_rate":"96000","duration":"19.512000","ext":".mp3"}'; $arr_post=json_decode($php_input,true); var_dump($arr_post); //輸出null
這里的問題出在avinfo的值中,原本應(yīng)該是一個字符串,但代碼里包含了沒有轉(zhuǎn)義的雙引號,導(dǎo)致json解析失敗。
修正后的代碼如下:
$php_input='{"key":"ao_1/f9pbbnam5_0_230502100035.mp3","fname":"ao_1/f9pbbnam5_0_230502100035.mp3","fsize":"234144","avinfo":"{"attachedpic":null,"audios":[{"disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"mp3 (mpeg audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}}],"maxab":96000,"subtitles":null,"videos":null,"audio":{"disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"mp3 (mpeg audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}},"format":{"bit_rate":"96000","duration":"19.512000","format_long_name":"mp2/3 (mpeg audio layer 2/3)","format_name":"mp3","nb_streams":1,"size":"234144","start_time":"0.000000","tags":{}},"subtitle":null,"video":null}","format_name":"mp3","bit_rate":"96000","duration":"19.512000","ext":".mp3"}'; $arr_post=json_decode($php_input,true); var_dump($arr_post); //輸出數(shù)組
如果不想手動修正json字符串,可以直接使用php數(shù)組來生成json:
$data = [ "key" => "ao_1/f9pbbnam5_0_230502100035.mp3", "fname" => "ao_1/f9pbbnam5_0_230502100035.mp3", "fsize" => "234144", "avinfo" => [ "attachedpic" => null, "audios" => [ [ "disposition" => ["attached_pic" => 0], "avg_frame_rate" => "0/0", "bit_rate" => "96000", "channels" => 2, "codec_long_name" => "mp3 (mpeg audio layer 3)", "codec_name" => "mp3", "codec_time_base" => "1/16000", "codec_type" => "audio", "duration" => "19.512000", "index" => 0, "nb_frames" => "", "profile" => "", "r_frame_rate" => "0/0", "sample_fmt" => "s16p", "sample_rate" => "16000", "start_time" => "0.000000", "tags" => [], ] ], // ... 其他數(shù)據(jù) ], "format_name" => "mp3", "bit_rate" => "96000", "duration" => "19.512000", "ext" => ".mp3", ]; $php_input = json_encode($data); $arr_post = json_decode($php_input, true); var_dump($arr_post); //輸出數(shù)組
另外,還可以使用preg_replace_callback()函數(shù)來自動轉(zhuǎn)義avinfo的值中的雙引號:
立即學(xué)習(xí)“PHP免費學(xué)習(xí)筆記(深入)”;
$php_input = '{"key":"ao_1/f9pbbnam5_0_230502100035.mp3","fname":"ao_1/f9pbbnam5_0_230502100035.mp3","fsize":"234144","avinfo":"{"AttachedPic":null,"Audios":[{"Disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"MP3 (MPEG audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}}],"MaxAB":96000,"Subtitles":null,"Videos":null,"audio":{"Disposition":{"attached_pic":0},"avg_frame_rate":"0/0","bit_rate":"96000","channels":2,"codec_long_name":"MP3 (MPEG audio layer 3)","codec_name":"mp3","codec_time_base":"1/16000","codec_type":"audio","duration":"19.512000","index":0,"nb_frames":"","profile":"","r_frame_rate":"0/0","sample_fmt":"s16p","sample_rate":"16000","start_time":"0.000000","tags":{}},"format":{"bit_rate":"96000","duration":"19.512000","format_long_name":"MP2/3 (MPEG audio layer 2/3)","format_name":"mp3","nb_streams":1,"size":"234144","start_time":"0.000000","tags":{}},"subtitle":null,"video":null}","format_name":"mp3","bit_rate":"96000","duration":"19.512000","ext":".mp3"}'; $php_input_fixed = preg_replace_callback( '/"avinfo":"(.*?)"/', function ($matches) { return '"avinfo":"' . str_replace('"', '"', $matches[1]) . '"'; }, $php_input ); $arr_post = json_decode($php_input_fixed, true); var_dump($arr_post);
通過上述方法,可以成功解析json字符串并得到預(yù)期的數(shù)組結(jié)果。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END
喜歡就支持一下吧
相關(guān)推薦