composer提示JSON解析失败报错解决_composer.json文件编码与逗号检查【方案】

11次阅读

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

composer提示JSON解析失败报错解决_composer.json文件编码与逗号检查【方案】

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(xEFxBBxBF)当成非法字符直接拒掉。

  • 用命令行快速检测:
    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/^xEFxBBxBF//' 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 内容——它们极大概率带隐藏格式

真正卡住人的往往不是语法错误本身,而是错误信息不指明位置,加上 BOM 和隐藏字符看不见。验证时别只信编辑器右下角写的“UTF-8”,得用 xxdcat -A 看真实字节;也别依赖“看起来没逗号”,得用 php -r 命令让 PHP 自己吐出错误详情。

text=ZqhQzanResources