
PHP 中数组与 JSON 的编解码性能差异主要取决于数据规模、嵌套深度、字符编码(尤其是中文)以及 PHP 版本。在大多数实际场景中,json_encode/json_decode 比 serialize/unserialize 快 2–3 倍,且生成的字符串更紧凑、跨语言兼容性更好;但对含资源、闭包或循环引用的数组,JSON 会直接失败。
小数据量(
对百元素以内、无深层嵌套的关联数组或索引数组,json_encode() 平均耗时约 0.005–0.015ms(PHP 8.1+),远低于 serialize() 的 0.02–0.04ms。此时差异可忽略,但 JSON 字符串体积通常小 30%–50%,利于网络传输和缓存存储。
- 推荐用
json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)避免中文转义和冗余反斜杠 - 若数组键全为整数且连续,PHP 会自动按索引数组处理,编码效率略高于混合键名
- 避免在循环内反复 encode 同一静态结构——提前缓存 JSON 字符串更高效
大数据或深层嵌套时需注意 decode 性能瓶颈
当 JSON 字符串超过 1MB 或嵌套层级 >64 层(PHP 默认限制),json_decode() 耗时会显著上升,并可能触发 memory_limit 或 max_execution_time 错误。而 unserialize() 在相同数据下虽慢,但对嵌套深度更宽容(除非开启 unserialize_callback_func)。
- 用
json_last_error()和json_last_error_msg()替代静默失败,便于定位格式问题 - 对超大 JSON,考虑流式解析(如 jsonstreamingparser)或分块加载
-
json_decode($json, true)返回数组比默认返回对象快约 10%–15%,因省去对象属性映射开销
中文与特殊字符处理影响编码一致性
PHP 数组原生支持 UTF-8 字符,但若源数据含 GBK 或其他编码字符串,json_encode() 会返回 false 或乱码。而 serialize() 不校验编码,照单序列化,后续反序列化仍可读——但这只是“表面可用”,跨环境易出错。
立即学习“PHP免费学习笔记(深入)”;
- 统一使用 UTF-8 是 JSON 正确工作的前提;可用
mb_convert_encoding($str, 'UTF-8', 'auto')预处理 - 含 HTML 实体、控制字符(如 \x00)的字符串,JSON 默认拒绝编码;加
JSON_INVALID_UTF8_IGNORE(PHP 7.2+)可跳过非法字节 - 数字类型精度:JSON 不区分 int/float,
123和123.0解码后均为 float;需严格类型可用filter_var($val, FILTER_VALIDATE_INT)二次校验
生产环境建议:优先 JSON,例外情况再降级
Web API、Redis 缓存、日志结构化等场景,默认走 JSON;仅当遇到以下情况才考虑 serialize() 或 MsgPack:
- 数组含 PHP 特有类型:资源句柄、匿名函数、SimpleXML 对象等
- 需保留对象类信息并复原为原类实例(JSON 只能还原为数组或 stdClass)
- 历史系统要求与旧版 PHP(
- 追求极致性能且不跨语言:可测试 msgpack,通常比 JSON 快 2–5 倍,体积再减 20%










