PHP处理JSON数据核心是json_encode()和json_decode():编码需加JSON_UNESCAPED_UNICODE保中文可读且确保UTF-8输入,解码后必须用json_last_error()判错而非仅检查null,关联数组与对象选择取决于第二个参数,大整数应启用JSON_BIGINT_AS_STRING防精度丢失。

PHP 处理 JSON 数据,核心就两条路:json_encode() 编码、json_decode() 解码。不加额外参数也能跑通,但一到中文、空值、大数字或格式错误,立刻出问题——关键不是会不会用,而是怎么避开默认行为埋的坑。
json_encode() 中文被转成 \uXXXX 怎么办
默认情况下,json_encode() 会把所有非 ASCII 字符(包括中文)转成 Unicode 转义序列,比如 "北京" 变成 "\u5317\u4eac"。前端能正常解析,但日志、调试、API 响应体里看着费劲,也影响可读性。
- 必须加
JSON_UNESCAPED_UNICODE标志:json_encode($data, JSON_UNESCAPED_UNICODE) - 如果还要美化输出(比如调试时),可以叠加
JSON_PRETTY_PRINT:json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) - 注意:输入数据本身必须是 UTF-8 编码,否则即使加了标志也会返回
false或乱码;可用mb_detect_encoding()检查,必要时用mb_convert_encoding($str, 'UTF-8', 'GBK')转换
json_decode() 返回 null 却没报错?
json_decode() 遇到非法 JSON 时不会抛异常,而是静默返回 null。很多开发者只检查 === null,却忽略 json_last_error() 的具体错误码,导致误判为“数据为空”而非“格式崩了”。
- 永远在调用后立即检查:
if (json_last_error() !== JSON_ERROR_NONE) - 常见错误类型:
JSON_ERROR_SYNTAX(多逗号、单引号、控制字符)、JSON_ERROR_UTF8(输入含 GBK 或乱码字节)、JSON_ERROR_DEPTH(嵌套太深) - 想看到具体错误信息,用
json_last_error_msg(),比如输出"Syntax error"或"Malformed UTF-8 characters" - 别依赖
empty()判断解码结果——null、false、空数组都算 empty,但原因完全不同
该返回数组还是对象?第二个参数到底怎么选
json_decode($json, $assoc) 的第二个参数决定返回结构:true 得关联数组,false(默认)得 stdClass 对象。选错会导致后续代码反复 -> 和 [] 混用,甚至 Notice 报错。
- API 接收前端传来的 JSON(如 POST body),强烈建议设为
true:json_decode($input, true)—— 数组支持isset()、array_key_exists()、foreach更自然,也避免对象属性不存在时触发Notice - 若需保持原始对象结构(比如反序列化第三方 SDK 返回的对象),用默认
false,但访问属性必须用->,且要提前确认键存在:isset($obj->name) - 注意:即使设
true,嵌套的 JSON 对象仍会变成数组,不是“全转数组”,只是顶层结构
大整数、浮点精度、布尔值这些细节容易翻车
JSON 本身没有整型/浮点区分,PHP 默认会把 JSON 数字按规则映射,但边界情况多:ID 过长变科学计数法、小数点后零丢失、true/false 和 1/0 混淆。
- 超长整数(如 18 位订单号)可能被 PHP 当 float 处理,精度丢失;加
JSON_BIGINT_AS_STRING让它强制转字符串:json_decode($json, true, 512, JSON_BIGINT_AS_STRING) - 需要保留小数点后零(如金额
"100.00"),JSON 本身不存格式,PHP 解析后就是 float;得靠业务层补零或改用字符串字段 - JSON 的
true/false严格对应 PHP 的true/false,但"true"(字符串)会被当字符串处理,不会自动转布尔 —— 类型必须一致 -
null在 JSON 和 PHP 中一一对应,但注意 PHP 数组中['key' => null]编码后是{"key":null},解码回来仍是null,不是空字符串或false
真正麻烦的不是函数调用本身,而是编码前没校验数据类型(比如资源、闭包无法序列化)、解码后没验证结构合法性(比如缺字段、类型错)、以及跨系统传输时字符编码和深度限制没对齐。这些地方不显眼,但一出问题就卡住整个流程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











