PHP处理JSON时数据类型错乱源于编码、配置或调用不当:JSON转数组仍为字符串需检查合法性、编码及空值;ThinkPHP模型JSON字段需声明$ json属性;中文乱码须统一UTF-8并加JSON_UNESCAPED_UNICODE;大数字溢出应启用JSON_BIGINT_AS_STRING。

PHP操作JSON数组时,数据类型错乱不是语法写错了,而是编码、配置或调用方式没对上——比如该转数组却拿到对象,该显示中文却变成\u5f20,该自动解包JSON字段却还是字符串。问题看似随机,其实有明确触发路径和对应解法。
JSON字符串转数组后仍是字符串?
典型表现:用 json_decode($str, true) 后,var_dump($arr) 显示 string 而非 array,或者 foreach($arr as ...) 直接报错。
- 先确认 $str 确实是合法JSON:用 json_last_error() 检查返回值是否为 JSON_ERROR_NONE;若为 JSON_ERROR_SYNTAX,说明字符串含非法字符(如BOM头、单引号、注释)
- 检查原始字符串编码:用 mb_detect_encoding($str) 看是不是 GBK/GB2312;若是,先执行 $str = mb_convert_encoding($str, 'UTF-8', 'GBK') 再解码
- 避免误传空值或布尔值:如果 $str === null 或 $str === false,json_decode 必然返回 null,需前置判空
ThinkPHP模型里JSON字段读出来还是字符串?
数据库字段设为 JSON 类型,模型查出来却不能直接当数组用,$model->config['api_key'] 报错——这不是TP6 bug,是它默认不自动反序列化。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 在模型类中声明:protected $json = ['config', 'extra'];,字段名必须与数据库列名完全一致(大小写敏感)
- 该配置只对 模型查询(如 find()、select())生效;用 Db::table() 直接查,$json 完全不起作用
- 不要和 $withAttr 共用同一字段:例如同时配置 'config' => 'json_decode',会导致重复解码,第二次 json_decode(array) 返回 null
中文显示成\u5f20或乱码?
输出JSON时中文被转义,或浏览器解析后显示方块、问号,本质是UTF-8链路断了。
立即学习“PHP免费学习笔记(深入)”;
- 编码端要干净:确保PHP文件本身保存为UTF-8无BOM;数据库连接加 charset=utf8mb4;表字段用 utf8mb4_unicode_ci
- 输出时加选项:json_encode($data, JSON_UNESCAPED_UNICODE),禁用Unicode转义
- 响应头要匹配:header('Content-Type: application/json; charset=utf-8');,注意不是 text/html
- 不推荐靠 iconv 或 mb_convert_encoding 临时补救——应从源头统一为UTF-8,否则易嵌套出错
大数字变0或科学计数?
数据库里存的是 15234897654321098765,JSON输出后变成 1.5234897654321E+19 或截断为0,这是整型溢出导致的。
- PHP 7.4+ 推荐加选项:json_encode($data, JSON_BIGINT_AS_STRING),强制把超长整数当字符串输出
- 若用 json_decode 解析含大整数的JSON,也需加同样选项,否则默认转为浮点,精度丢失不可逆
- 前端接收时注意:JavaScript安全整数上限是 2^53 - 1,超长ID务必传字符串,别依赖parseInt


















