PHP多维数组转JSON需综合运用json_encode()标准选项、预处理结构、分层递归、第三方库及错误验证五种方法,确保编码完整性、中文正常、结构不丢失且可调试。

当您使用 PHP 将嵌套层级较深或包含混合数据类型的多维数组转换为 JSON 字符串时,可能遇到编码失败、中文乱码、null 值意外替换或对象/数组结构丢失等问题。以下是实现可靠 JSON 编码的多种方法:
一、使用 json_encode() 配合标准选项
PHP 内置的 json_encode() 函数是处理多维数组转 JSON 的基础方式,但需正确设置标志位以保障完整性与可读性。
1、确保数组键名和值均为 UTF-8 编码,若含 GBK 或其他编码字符串,先用 mb_convert_encoding() 转换。
2、调用 json_encode() 时传入 JSON_UNESCAPED_UNICODE 标志,避免中文被转为 \uXXXX 序列。
立即学习“PHP免费学习笔记(深入)”;
3、添加 JSON_INVALID_UTF8_SUBSTITUTE 标志,自动过滤非法 UTF-8 字节序列,防止编码中断。
4、对含资源、闭包或不可序列化对象的数组,提前使用 array_walk_recursive() 过滤或替换为 null。
二、预处理数组结构再编码
针对存在循环引用、私有属性、__toString() 干扰或 DateTime 对象等复杂场景,需在编码前标准化数组结构。
1、遍历原数组,检测并移除 resource 类型值,例如数据库连接句柄或文件指针。
2、将 DateTime 实例统一转换为 ISO8601 字符串格式:$value->format('c')。
3、对实现了 JsonSerializable 接口的对象,调用其 jsonSerialize() 方法获取纯净数组后再合并。
4、使用 spl_object_hash() 辅助识别循环引用,对已出现过的对象引用跳过或标记为 "__circular_ref__"。
三、分层递归编码控制
对于超大深度或需差异化处理各层级数据的数组(如仅某一层需转义 HTML),可采用手动递归替代一次性 json_encode()。
1、编写递归函数,参数为当前层级数组及当前深度计数器。
2、在每层入口判断深度是否超过限制(如 5 层),超出则截断并插入 "__truncated__" 占位符。
3、对字符串值单独调用 htmlspecialchars() 或 addslashes(),其余类型保持原样进入下一层。
4、叶子节点字符串统一通过 utf8_encode() 强制转码(仅用于非 UTF-8 源数据)。
四、使用第三方库进行增强编码
当内置函数无法满足容错性、性能或格式定制需求时,可引入轻量级库替代原始编码流程。
1、安装 composer require justinrainbow/json-schema(仅需其 Encoder 组件)或更专注的 json-tools/php-json-encoder。
2、实例化编码器对象,设置 strict_mode = false 允许跳过不可序列化项而非报错。
3、启用 indent_output 选项生成带缩进的可读 JSON,便于调试嵌套结构。
4、注册自定义类型处理器,例如将 SplFixedArray 自动展开为普通索引数组。
五、错误捕获与编码结果验证
编码后必须验证输出有效性,防止静默失败导致前端解析异常。
1、检查 json_encode() 返回值是否为 string 类型,若返回 false 则立即调用 json_last_error_msg() 获取错误原因。
2、使用 json_decode($result, true) 反向解析生成的 JSON 字符串,确认能无损还原为数组结构。
3、比对原数组与反解数组的 serialize() 哈希值,验证关键字段未被意外修改或截断。
4、对输出字符串执行 preg_match('/[^\x20-\x7E\x09\x0A\x0D\xC0-\xFD]/', $result),检测残留非法字节。











