Composer install报JSON decode failed的主因是composer.json存在BOM头、尾随逗号、非法引号、Unicode转义错误或隐藏控制字符;需用xxd/cat-A检测BOM与隐藏符,php -r验证具体错误位置。

composer install 报错 JSON decode failed 的常见原因
这错误基本不是 Composer 本身坏了,而是 composer.json 文件被解析时卡在了语法或编码层面。PHP 的 json_decode() 函数极其严格:BOM 头、尾随逗号、Unicode 转义错误、不可见控制字符,全都会导致直接失败,且不报具体哪一行——只甩一句 JSON decode failed。
检查文件编码是否含 BOM(尤其是 Windows 编辑器保存的 UTF-8)
很多编辑器(如老版 Notepad++、某些 VS Code 插件配置不当)默认保存为 UTF-8 with BOM,而 PHP 的 json_decode() 会把开头的 BOM(\xEF\xBB\xBF)当成非法字符直接拒掉。
- 用命令行快速检测:
head -c 3 composer.json | xxd
如果输出里有ef bb bf,就确认存在 BOM - VS Code:右下角点击编码名(如 “UTF-8”),选
Save with Encoding → UTF-8(注意不是 “UTF-8 with BOM”) - Sublime Text:菜单
File → Save with Encoding → UTF-8 - Linux/macOS 下可强制去除:
sed -i '1s/^\xEF\xBB\xBF//' composer.json
验证 JSON 语法:尾随逗号、引号、转义与空格
Composer 不接受对象或数组末尾的逗号(,),哪怕只多一个,也会报错。另外,中文引号、全角标点、未转义的反斜杠、换行符混入字符串值中,也常被忽略。
- 用在线工具验证前,先本地跑一遍:
php -r "echo json_encode(json_decode(file_get_contents('composer.json'), true), JSON_PRETTY_PRINT);"成功则输出格式化后的内容;失败会打印具体错误位置(PHP 7.4+ 更准) - 重点检查这些位置:
"require": { ... }和"autoload": { ... }末尾有没有多余逗号 - 所有键名和字符串值必须用英文双引号
",不能用单引号或中文引号 - 路径或版本号里若含
\(比如 Windows 风格路径),要写成\\\\或改用正斜杠/
隐藏字符与编辑器自动修正干扰
某些编辑器(特别是带“智能引号”或“自动补全括号”功能的)会在粘贴或编辑时悄悄插入零宽空格(\u200b)、软连字符(\u00ad)或非断空格(\u00a0),肉眼完全不可见,但 JSON 解析器会当场崩溃。
- 用
cat -A composer.json(Linux/macOS)或Get-Content composer.json -Encoding Byte(PowerShell)查看是否有异常符号 - 最稳妥做法:新建空白文件,手动敲一遍最简结构(只留
{}),再逐段复制粘贴内容,每加一段就composer validate一次 - 避免从网页、微信、PDF 等来源直接复制 JSON 内容——它们极大概率带隐藏格式
xxd 或 cat -A 看真实字节;也别依赖“看起来没逗号”,得用 php -r 命令让 PHP 自己吐出错误详情。










