本站资源收集于互联网,不提供软件存储服务,每天免费更新优质的软件以及学习资源!

PHP的json

网络教程 app 1℃

PHP的json
为什么php的json_decode()函数解析这个json字符串时返回null而不是预期的数组?

在使用php解析json字符串时,有时候会遇到json_decode()函数返回null的情况。根据提供的代码示例:

$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的值中,原本应该是一个字符串,但代码里包含了没有转义的双引号,导致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); //输出数组

如果不想手动修正json字符串,可以直接使用php数组来生成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" => [],] ], // … 其他数据 ], "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); //输出数组

另外,还可以使用preg_replace_callback()函数来自动转义avinfo的值中的双引号:

$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字符串并得到预期的数组结果。

以上就是PHP的json_decode()函数为什么会返回NULL而不是预期的数组?的详细内容,更多请关注范的资源库其它相关文章!

转载请注明:范的资源库 » PHP的json

喜欢 (0)