PHP JSON解析与生成教学_PHP处理JSON数据完整流程
技术百科
舞夢輝影
发布时间:2025-12-18
浏览: 次 PHP处理JSON的核心是json_encode()和json_decode():前者将PHP变量转JSON字符串,注意数组类型、中文编码及不可序列化值返回false;后者将JSON转PHP变量,默认返对象,加true参数返数组,失败返回null,需用json_last_error()或JSON_THROW_ON_ERROR检查错误。
PHP 处理 JSON 数据的核心就是 json_encode() 和 json_decode() 两个函数,用对了就很简单,用错了就容易出 Warning 或返回 null。关键不在语法多难,而在理解数据类型转换规则和错误处理习惯。
JSON 生成:把 PHP 变量转成 JSON 字符串
用 json_encode() 把数组或对象转为合法 JSON 字符串。注意三点:
- 关联数组(键名是字符串)会生成 JSON 对象
{"name":"张三"};索引数组(键名是数字且连续)会生成 JSON 数组["a","b"] - 中文默认被转成 Unicode(如
\u4f60),加 JSON_UNESCAPED_UNICODE 参数可保留原文:json_encode($data, JSON_UNESCAPED_UNICODE) - 如果变量含资源、闭包或不可序列化的对象,json_encode 会返回 false,建议加判断:
if (false === $json = json_encode($data)) { /* 处理错误 */ }
JSON 解析:把 JSON 字符串转回 PHP 变量
用 json_decode() 还原数据,默认返回 stdClass 对象;传第二个参数 true 才返回关联数组:
-
json_decode('{"name":"李四"}')→ 对象,取值写法:$obj->name -
json_decode('{"name":"李四"}', true)→ 数组,取值写法:$arr['name'] - 解析失败时返回 null(不是 false!),可用
js查具体错误,比如
on_last_error()JSON_ERROR_SYNTAX表示 JSON 格式不对 - 常见坑:前端传来的 JSON 字符串可能带 BOM 或多余空格,建议先
trim($json_str)再解析
实战中必须加的防护动作
真实项目里不能假设 JSON 一定合法。每次 decode 后都该检查:
- 是否为 null(解析失败)
- 是否为期望类型(比如预期是数组,结果却是对象)
- 关键字段是否存在(用
isset()或array_key_exists())
一个轻量级校验示例:
$data = json_decode($input, true); if (null === $data || !is_array($data) || !isset($data['id'])) { die('非法 JSON 或缺少 id 字段'); }进阶技巧:自定义 JSON 行为
PHP 7.3+ 支持 JSON_THROW_ON_ERROR,让解析失败直接抛异常,比查错误码更直观:
-
json_decode($str, true, 512, JSON_THROW_ON_ERROR)—— 错误时抛JsonException - 配合 try/catch 写法更干净,适合 API 接口层统一错误处理
- 若需控制浮点数精度、跳过 NaN/INF,可用
JSON_PRESERVE_ZERO_FRACTION等扩展标志
基本上就这些。不复杂但容易忽略细节,尤其是错误判断和中文编码。写完 encode/decode 多看一眼返回值,比事后 debug 快十倍。
# 尤其是
# 而在
# 却是
# 进阶
# 第二个
# input
# js
# json
# 对象
# if
# 编码
# 字符串
# 接口
# 序列化
# NULL
# 前端
# 数据类型
# bom
# 错了
# try
# catch
# php
# 类型转换
# 闭包
# die
# 转成
# 关联数组
# 李四
# 键名
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- VSC怎么在PHP中调试MySQL_数据库交互排查
- 如何使用 Selenium 正确获取篮球参考网站球
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- 如何使用Golang管理跨项目依赖_Golang多
- php中作用域操作符能访问私有静态属性吗_访问权限
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Windows10如何查看保存的WiFi密码_Wi
- Win11右键反应慢怎么办 Win11优化右键菜单
- windows如何修改文件默认打开方式_windo
- 如何在Golang中使用time处理时间_Gola
- Win10怎么设置开机密码_Windows10账户
- MAC如何安装Git版本控制工具_MAC开发环境配
- php会话怎么开启_session_start函数
- Win11怎么卸载Photos应用_Win11卸载
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win10电脑怎么设置休眠快捷键_Windows1
- Win10怎样卸载iTunes_Win10卸载iT
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win11怎么设置应用分屏_Windows11贴靠
- Windows怎样拦截WPS弹窗广告_Window
- Win11怎么查看硬盘型号_Windows 11检
- php本地部署支持nodejs吗_php与node
- 如何使用Golang sort排序切片_Golan
- Windows10电脑怎么连接蓝牙设备_Win10
- 如何在 Python 中将 ISO 8601 时间
- Win11截图快捷键是什么_Win11自带截图工具
- 如何使用Golang读取日志文件_Golang b
- 如何在Golang中优化文件读写性能_使用缓冲和并
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Win11怎么查看wifi信号强度_检测Windo
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- Linux如何使用grep搜索文件内容_Linux
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- Go 语言标准库为何不提供泛型切片的 Contai
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Python代码测试策略_质量保障解析【教程】
- 如何使用Golang log设置日志输出格式_Go
- Win11如何设置文件关联 Win11修改特定文件
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- c++怎么调用nana库开发GUI_c++ 现代风
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Win10系统怎么查看显卡温度_Win10任务管理
- Windows 11如何查看系统激活密钥_Wind
- C#如何序列化对象为XML XmlSerializ
- Windows10如何更改开机密码_Win10登录
- Python项目维护经验_长期演进说明【指导】
- Win11怎么清理C盘OneDrive缓存_Win
- Python异步网络编程_aiohttp说明【指导
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- c++如何实现一个高性能的环形队列(Ring Bu

on_last_error()
QQ客服