Composer报“JSON decode error: Syntax error”却无行号,主因是文件含BOM头、GBK字节或控制字符等非法UTF-8编码;可用file -i、hexdump或php -r命令精准检测并修复为UTF-8无BOM。

这是 composer.json 文件编码不合规导致的解析失败,不是语法写错了,而是文件开头或中间混入了 PHP json_decode() 无法容忍的字节(比如 BOM、GBK 字节、控制字符)。
为什么 composer install 报 “JSON decode error: Syntax error” 却找不到错在哪
PHP 的 json_decode() 在遇到非法 UTF-8 字节时直接返回 false,只抛出笼统的 Syntax error,不带行号、不标位置。常见诱因有:
- BOM 头(
EF BB BF)——Windows 记事本、WPS、某些 CMS 后台编辑器默认保存为“UTF-8 with BOM” - 文件里混了 GBK 编码的中文(比如从网页复制粘贴后未转码)
- 不可见控制字符(如
\x00、\x1A),常来自富文本编辑器或远程配置导出 - JSON 注释(
//或/* */)——JSON 标准不支持,任何版本的 Composer 都会崩
怎么快速确认是不是编码问题
别信编辑器右下角显示的“UTF-8”,用终端命令验证真实编码和内容:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
file -i composer.json:输出含charset=utf-8才算过关;若显示charset=us-ascii或charset=unknown-8bit,基本就是非 UTF-8 -
xxd composer.json | head -n 1(macOS/Linux)或hexdump -C composer.json | head -n 5:看开头是否是ef bb bf(BOM) -
grep -P "\x80-\xFF" composer.json | head -n 1:命中说明存在非 ASCII 字节,大概率是 GBK 或其他编码残留 -
php -r "json_decode(file_get_contents('composer.json')) || die(json_last_error_msg());":PHP 8.0+ 会附带偏移量,帮你缩小排查范围
怎么安全修复并永久避免
修复不是“重写一遍”,而是精准清除非法字节,同时堵住源头:
- VS Code:右下角点击编码名 → Save with Encoding → 选
UTF-8(注意不是UTF-8 with BOM) - Sublime Text:菜单
File → Save with Encoding → UTF-8,存完再检查右下角状态栏是否显示UTF-8 - 命令行强制转无 BOM UTF-8:
iconv -f UTF-8 -t UTF-8//IGNORE composer.json | sed 's/^\xEF\xBB\xBF//' > tmp.json && mv tmp.json composer.json - 团队 CI 中加校验:
if ! [[ $(file -i composer.json) == *"charset=utf-8"* ]]; then echo "FAIL: composer.json not UTF-8"; exit 1; fi - Git 级防护:在项目根目录加
.gitattributes,写一行composer.json text eol=lf encoding=utf-8
真正难防的不是技术操作,而是有人用 Windows 记事本改完直接提交——那个 BOM 会埋进 Git 历史,之后所有人的 composer install 都可能随机失败,且错误信息毫无提示性。

















