PHP的json_decode()函数为何返回NULL而不是数组?
时间:2025-03-27 18:45:40 404浏览 收藏
本文探讨了PHP `json_decode()` 函数返回 NULL 而不是数组的常见原因及解决方法。由于JSON字符串中包含未转义的双引号,导致`json_decode()` 函数解析失败,返回 NULL。文章提供了三种解决方法:手动转义JSON字符串中的双引号、使用PHP数组生成JSON字符串以及利用`preg_replace_callback()` 函数自动转义双引号。 通过这三种方法,可以确保`json_decode()` 函数正确解析JSON字符串并返回预期的数组结果。 这对于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而不是数组?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!
相关阅读
更多>
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
469 收藏
-
161 收藏
-
149 收藏
-
151 收藏
-
385 收藏
-
310 收藏
-
487 收藏
-
346 收藏
-
297 收藏
-
473 收藏
-
316 收藏
-
110 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习