接口返回给前端一段中文,浏览器里却是一串u开头的转义码;对接第三方接口返回false,日志里还看不出原因。这些场面多半都栽在php json_encode的参数和编码上,函数本身其实不难。
基本用法一行:json_encode($data),$data是数组或对象,返回JSON字符串。想把中文原样输出,加常量JSON_UNESCAPED_UNICODE;想排版好看方便排查,再加JSON_PRETTY_PRINT,多个常量用竖线连起来传。
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
这样前端拿到的就是带缩进的原样中文,肉眼直接看问题。
四个常踩的坑
- 中文变转义码:默认行为,不是bug,加JSON_UNESCAPED_UNICODE即可
- 返回false:多半是源数据里有非法UTF-8字符,比如GBK编码的字符串没转码,用json_last_error定位,报JSON_ERROR_UTF8基本就是编码问题
- 数组还是对象:连续数字键输出成JSON数组,键名不全或是字符串键就输出成对象,前端类型对不上先看键
- 斜杠被转义:路径类的分隔符默认会转义,加JSON_UNESCAPED_SLASHES输出原样
输出到接口时记得配一句header,声明Content-Type为application/json,前端解析才不纠结。别手拼JSON字符串,转义能坑死人,交给json_encode做。调试时var_dump加exit最直接。
版本方面,PHP 5.4起才有JSON_UNESCAPED_UNICODE,老项目用不了就得先升级,或者退一步用preg替换回中文,但那属于绕路,不划算。做事的顺序是先把编码统一:数据库连接、文件读取都确认UTF-8,json_encode的麻烦少一大半。