这是PHP解析composer.json失败导致的假语法错误,实际因BOM头、错误编码、备份文件干扰或非法字符使json_decode()返回null,进而引发后续属性访问异常。

这不是JSON语法错误,而是composer.json被当成PHP文件解析了——你当前执行命令的目录里,很可能混进了同名但内容错误的composer.json文件,或者PHP解析器误读了文件编码/BOM头。
为什么报“缺少括号”却不是JSON问题
Composer本身不校验JSON语法是否合法;它调用PHP的json_decode()函数读取composer.json,而这个函数在遇到非法字符(如UTF-8 BOM、不可见控制符、中文引号)时,会返回null,PHP后续尝试访问null->require之类属性就抛出“syntax error, unexpected ‘{’”或“unexpected ‘[’”这类看似括号缺失的错误——实际是前面根本没成功解析出数组对象。
- 检查
composer.json开头是否有EF BB BF字节(BOM头),可用head -c 3 composer.json | xxd确认 - 用
file -i composer.json看编码是否为utf-8,非utf-8(如utf-16)必报错 - 用
php -r "var_dump(json_decode(file_get_contents('composer.json'), true));"直接测试解析结果:返回null即证明文件内容不可解析 - 注意:某些编辑器(如Windows记事本、VS Code未关自动BOM)保存时会悄悄加BOM
常见伪装成JSON的“假composer.json”
真正出问题的往往不是你写的那个composer.json,而是项目根目录下存在其他同名文件干扰:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
composer.json.bak、composer.json.old等备份文件,内容可能是PHP数组写法(如array('require' => array(...))),被Composer扫描到后当作有效配置读入 - IDE自动生成的
composer.json~(波浪线备份)或.composer.json.swp(vim交换文件) - Git冲突标记残留:
<<<< HEAD段落没清理干净,导致JSON结构断裂 - 复制粘贴时带入了Word/微信里的全角引号
“”或破折号——,肉眼难辨但json_decode()直接失败
快速验证和修复步骤
别急着重写文件,先用这几步定位真实源头:
- 运行
find . -maxdepth 1 -name 'composer.json*'列出所有疑似文件,逐个head -n 5查看内容 - 执行
composer diagnose——它会明确告诉你正在读哪个路径的composer.json,注意输出里的Reading <code>/path/to/composer.json行 - 临时重命名当前
composer.json为composer.json.safe,再运行composer init生成新文件,对比结构差异 - 若确定是BOM问题,用
sed -i '1s/^\xEF\xBB\xBF//' composer.json(Linux/macOS)或Notepad++“编码→转为UTF-8无BOM格式”修复
最常被忽略的是:错误提示里的“expecting {”其实来自PHP试图访问一个null变量的属性,而不是JSON解析器报的错。盯住json_decode()的返回值,比盯着报错行更有效。

















