json_encode()不能直接转json字符串,否则会双重编码;应先用json_last_error()检查错误,再按需用json_decode()解析,注意bom、编码、语法及参数true/false含义。

json_encode() 不能直接转任意字符串
PHP 里没有“字符串转 JSON 对象”这回事——json_encode() 的作用是把 PHP 变量(数组、对象等)序列化成 JSON 格式的字符串;而你手头的如果已经是纯字符串(比如 '{"name":"张三"}'),它本身已是合法 JSON 文本,不需要再 encode。
常见错误现象:json_encode('{"name":"张三"}') 得到的是 "{\"name\":\"张三\"}",多了一层引号和转义,后续 json_decode() 会失败或返回字符串而非对象。
- 想把 PHP 数组/对象变成 JSON 字符串 → 用
json_encode() - 想把 JSON 字符串变成 PHP 数组或对象 → 用
json_decode() - 不确定输入来源是否已为 JSON 字符串?先
json_last_error()检查有效性
json_decode() 解析失败的三个高频原因
明明看着是标准 JSON,json_decode() 却返回 null,大概率掉进了这三个坑里:
- 字符串含 BOM 头(尤其 Windows 记事本保存的 UTF-8 文件)→ 用
trim($str, "\xEF\xBB\xBF")去掉 - 中文或其他非 ASCII 字符被错误编码(如 GBK 混入 UTF-8)→ 确保输入字符串是 UTF-8 编码,可用
mb_detect_encoding()辅助判断 - JSON 中用了单引号、尾逗号、注释(如
{'name': '张三',})→ 这些都不是合法 JSON,PHP 不容忍,必须修正为双引号 + 无尾逗号
json_decode() 第二个参数 true/false 怎么选
这个布尔参数决定返回值类型,不是“要不要数组”,而是“要不要关联数组”:
立即学习“PHP免费学习笔记(深入)”;
本文档主要讲述的是JSON.NET 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
-
false(默认)→ 返回stdClass对象,访问用$obj->name -
true→ 返回关联数组,访问用$arr['name']
注意:即使设为 true,嵌套结构里的数字索引数组仍保持数字键;而 false 下所有键都只能用对象属性方式访问。性能上差异极小,选哪个取决于你后续代码更习惯对象还是数组操作。
遇到中文乱码或 null,先跑这一行检查
别急着改逻辑,先把输入字符串扔进验证流程:
var_dump(json_last_error(), json_last_error_msg());
如果输出是 4 和 "Syntax error",说明 JSON 格式不合法;如果是 5 和 "UTF-8 encode error",就是编码问题。很多“转不了 JSON”的问题,其实根本没走到 json_decode(),卡在了字符串本身不干净。
真正难处理的,是那些看似正常但含不可见控制字符(比如 \u202E 从右向左覆盖符号)的字符串——它们不会触发 json_last_error(),却会让前端解析崩溃。这种得靠 preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $str) 清洗。










