PHP的json_decode()函數(shù)為什么會返回NULL而不是預(yù)期的數(shù)組?

為什么phpjson_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é)果。

以上就是PHP的json_decode()函數(shù)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊15 分享