答案是UTF-8 with BOM导致json_decode()返回null,需用VS Code另存为UTF-8无BOM或用sed/PowerShell清除EF BB BF,并配合jsonlint.com定位全角符号等非法字符。

Composer 报 JSON decode error、Could not parse composer.json 或静默失败,99% 是 composer.json 编码不对,不是语法写错了——它根本没机会解析到你的花括号。
怎么确认是不是 BOM 导致的?
别猜。直接验证:
- VS Code 打开
composer.json,右下角看编码标识:若显示UTF-8 with BOM,就是它 - Linux/macOS 运行
file -i composer.json,输出含charset=bom即确认 - Windows PowerShell 执行
Get-Content composer.json -Raw | Select-Object -First 1 | Format-Hex,开头三字节是EF BB BF就坐实了
如何快速清除 BOM(不改内容)?
编辑器操作快但依赖 GUI;命令行更可控,尤其适合 CI/CD:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- Linux/macOS:
sed '1s/^\xEF\xBB\xBF//' composer.json > composer.json.tmp && mv composer.json.tmp composer.json - PowerShell:
(Get-Content composer.json -Raw) -replace "", "" | Set-Content composer.json -NoNewline(注意引号内是真正的 BOM 字符,复制易丢,建议手打或用 VS Code 替换) - VS Code:打开 → 右下角点击编码 →
Save with Encoding→ 选UTF-8(不是UTF-8 with BOM)
为什么删了 BOM 还报错?小心这些“隐形污染”
BOM 只是头号嫌疑,全角符号、零宽空格、中文引号才是难缠的二号敌人:
- 从网页/微信/Word 复制内容进
composer.json,极易混入全角冒号:、中文引号“”、零宽空格U+200B - VS Code 开启
Toggle Render Whitespace(Ctrl+Shift+P → 输入该命令),所有不可见字符立刻现形 - 粘贴到 jsonlint.com,它会高亮标出第一处非法字符位置,比扫文件快十倍
- 执行
php -r "json_decode(file_get_contents('composer.json')) || die(json_last_error_msg());",PHP 8.0+ 还会返回偏移量,配合编辑器跳转精准定位
中文字段本身合法,但路径字段里夹中文就危险
"name": "我的项目" 没问题,但 "autoload": {"psr-4": {"App\": "src/我的模块/"}} 就可能崩——某些 IDE 保存时把路径名用 GBK 编码写入,而 Composer 在 UTF-8 环境下读取失败,导致 autoload 映射为空、Class not found。
检查所有含中文的路径值:"autoload"、"bin"、"scripts" 下的命令路径,确保它们是纯 ASCII 字符;若必须用中文目录名,统一用英文别名映射,避免编码歧义。

















