php处理json核心是json_encode()和json_decode(),编码时用json_unescaped_unicode显中文、json_pretty_print美化、json_force_object转对象;解码时设参数选数组或对象,加json_bigint_as_string保大数精度;必做json_last_error()检查,防null陷阱。

PHP处理JSON数据,核心就靠 json_encode() 和 json_decode() 这两个函数。它们不是万能胶,但用对了参数、避开常见坑,就能稳定支撑API通信、前后端交互和配置存储等关键场景。
编码时让中文不乱码、结构更清晰
默认情况下,json_encode() 会把中文转成 \uXXXX 形式,看着费劲也不利于调试。加个 JSON_UNESCAPED_UNICODE 就能原样输出:
-
json_encode($data, JSON_UNESCAPED_UNICODE)—— 中文直接显示,比如{"name":"李四"} - 加上
JSON_PRETTY_PRINT可以缩进换行,方便人工查看(上线环境建议关掉,减少传输体积) - 如果传入的是索引数组但想强制转成JSON对象(即
{}而非[]),用JSON_FORCE_OBJECT - 确保输入数据本身是UTF-8编码,否则即使加了选项也无效;非UTF-8字符串可用
mb_convert_encoding($str, 'UTF-8', 'GBK')转换
解码时选对数据类型,避免调用出错
json_decode() 返回值类型由第二个参数决定,这点直接影响后续代码写法:
- 设为
true→ 返回关联数组:$arr['name']这样访问 - 设为
false(或省略)→ 返回stdClass对象:$obj->name这样访问 - 嵌套结构里混用容易报错,建议统一风格;API返回多为对象格式,前端习惯用点号取值,后端存数据库常用数组
- 若JSON里含超大整数(如微信OpenID、订单号),PHP可能自动转成科学计数或丢失精度,加
JSON_BIGINT_AS_STRING让它保持字符串形式
必须做的错误检查,不能靠运气
json_decode() 解析失败不会抛异常,而是静默返回 null。跳过检查等于埋雷:
- 每次调用后都应判断:
if ($data === null && json_last_error() !== JSON_ERROR_NONE) - 用
json_last_error_msg()获取具体提示,比如"Syntax error"、"Malformed UTF-8 characters" - 常见诱因:前端发来单引号JSON、末尾多逗号、含BOM头、混合了不可见控制字符(如
\u200b零宽空格) - 调试时可先用
trim()去首尾空白,再用mb_detect_encoding()确认编码,必要时用iconv('GBK', 'UTF-8//IGNORE', $str)强制转码
处理大JSON或特殊场景的小技巧
普通接口基本够用,但遇到大文件、流式响应或特殊字段时,得稍作调整:
- 读取大JSON文件别一次性
file_get_contents(),改用stream_get_line()分块解析,或引入jsonstream类库做流式处理 - HTML内容嵌在JSON里?先用
htmlspecialchars()编码,避免XSS;服务端解码后再展示 - 自定义对象转换逻辑?实现
JsonSerializable接口,在json_encode()时自动调用jsonSerialize()方法 - 性能敏感场景(如高频日志上报),避免反复 encode/decode,考虑用
pack()+ 二进制协议替代,或启用 OPcache 预编译
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











