json_decode()的$flags参数控制返回类型、中文解析和大数字处理:JSON_OBJECT_AS_ARRAY返回数组,JSON_BIGINT_AS_STRING保大数精度,JSON_UNESCAPED_UNICODE仅影响编码输出。

PHP 的 json_decode() 函数中,$flags 参数用于控制解码行为,最常用的是处理返回类型(数组 or 对象)和特殊字符(如中文、大数字)的解析方式。
控制返回值是数组还是对象
默认情况下,json_decode($json) 返回 stdClass 对象。加 JSON_OBJECT_AS_ARRAY 标志可强制返回关联数组:
-
json_decode($json)→ 返回对象(属性访问:$obj->name) -
json_decode($json, true)→ 等价于json_decode($json, JSON_OBJECT_AS_ARRAY),返回关联数组(下标访问:$arr['name'])
正确解析中文等 UTF-8 字符
如果原始 JSON 字符串含中文但被转义为 \uXXXX 形式(比如 "\u4f60\u597d"),默认能正常解码;但如果 JSON 是 GBK 编码或含非法 UTF-8 序列,json_decode 会失败(返回 null)。此时 $flags 本身不负责编码转换,但可配合 JSON_UNESCAPED_UNICODE 避免二次转义:
-
JSON_UNESCAPED_UNICODE:让中文不被转成\u4f60,保持原样输出(仅影响json_encode,但常与json_decode配合使用) - 真正解决乱码,需确保输入字符串是合法 UTF-8 —— 可用
mb_convert_encoding($json, 'UTF-8', 'GBK')预处理
安全处理大数字(避免丢失精度)
JSON 中超长数字(如微信 openid、17位以上整数)在 PHP 中可能被自动转为浮点数,导致精度丢失。启用 JSON_BIGINT_AS_STRING 可让这些数字以字符串形式返回:
立即学习“PHP免费学习笔记(深入)”;
$data = json_decode('{"id":12345678901234567890}', true, 512, JSON_BIGINT_AS_STRING);- 结果:
$data['id']是字符串"12345678901234567890",而非四舍五入后的浮点数 - 注意:该标志只对顶层或嵌套中的纯数字生效,不改变已转为 float 的历史行为
组合多个 flags
多个 flag 可用按位或(|)组合,例如同时要数组返回 + 不转义中文 + 大数当字符串:
json_decode($json, true, 512, JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE);- 注意:
JSON_UNESCAPED_UNICODE对json_decode实际无直接影响,但它常出现在调试场景中,配合后续json_encode输出时保持中文可读



















