composer报json decode error时问题100%在本地composer.json文件,应运行php -r "json_decode(file_get_contents('composer.json')) or die('json error: '.json_last_error_msg());"定位错误,或用jsonlint.com、jq、vs code校验,常见非法字符包括末尾逗号、中文引号、bom头、注释等。

Composer 镜像本身不参与 JSON 解析——报 JSON decode error 时,问题 100% 出在本地 composer.json 文件,和镜像源无关。换源、清缓存、重装 Composer 全部无效,必须修文件。
怎么快速定位 composer.json 的非法字符位置
Composer 自身错误提示(如 Parse error on line 12 at column 5)已经给了线索,但更准的是绕过 Composer,直接调用 PHP 原生解析:
- 运行
php -r "json_decode(file_get_contents('composer.json')) or die('JSON error: '.json_last_error_msg());"—— 输出带行号的错误(PHP 8.0+ 更准) - 粘贴内容到 jsonlint.com(关掉“允许注释”选项),它会高亮具体字符并标出行列
- 用
jq '.' composer.json(需先brew install jq或apt install jq),报错直接带精确位置 - VS Code 打开后右下角确认语言模式是
JSON(不是JSON with Comments),红色波浪线处就是语法破绽
哪些“看起来正常”的写法实际触发 JSON decode error
JSON 是严格子集,很多 PHP 数组或手写习惯在这里是非法的:
- 对象或数组末尾多逗号:
"require": { "monolog/monolog": "^2.0", }→ 删掉最后那个, - 用了单引号或中文引号:
'name': 'my/app'或“name”: “my/app”→ 必须全用英文双引号"name": "my/app" - 写了注释:
// dev-only或/* required */→ JSON 不允许任何注释,一律删掉 - 路径含 Windows 反斜杠:
"psr-4": { "App\": "src\\" }→ 改成正斜杠"App\": "src/"(注意 namespace 里的\是合法的,目录路径必须用/) - 文件开头有 BOM:
file -i composer.json输出含charset=binary或utf-8-with-bom→ 用 VS Code 保存为UTF-8(不是UTF-8 with BOM)
为什么 composer validate 不报错但 install 还失败
composer validate 只校验 JSON 结构 + 官方 schema 字段存在性,不触发真实 json_decode();而 install 会读取并解析内容,所以:
-
"version": "dev-main":validate 通过,但若 Packagist 上不存在该分支,install报找不到包 -
"autoload": { "psr-4": { "App": "src//" } }:validate 不管路径末尾多斜杠,dump-autoload却会警告路径不存在 -
"config": { "allow-plugins": {} }:Composer 2.2+ 才支持,老版本 validate 不识别,运行时报未定义字段 - 想提前发现语义问题?加
--strict:运行composer validate --strict,它会检查拼写(如requre)、未定义字段、值类型等
最易被忽略的是:改完 composer.json 后,vendor/ 和 composer.lock 里可能残留旧状态(比如上次 fallback 成复制而非软链接),导致新配置不生效。务必手动删掉这两个目录再重跑 composer install。











