GitHub Workflow中toJson与fromJson使用报错问题咨询
GitHub Workflow跨作业传递矩阵参数报错问题解析
问题场景
在GitHub Workflow中尝试通过matrix作业输出JSON格式的PHP版本列表,再在build作业中用fromJson读取该输出作为矩阵参数时触发报错,相关代码如下:
on: push: jobs: matrix: runs-on: ubuntu-latest name: Setup outputs: php-versions: ${{ toJson('["7.4.10", "5.6.13", "7.4.33", "8.1"]') }} build: runs-on: ubuntu-latest needs: matrix strategy: fail-fast: false matrix: version: ${{ fromJson(needs.matrix.outputs.php-versions) }}
报错信息:
Error when evaluating 'strategy' for job 'build'. .github/workflows/test.yaml (Line: 17, Col: 26): Unexpected value '["7.4.10", "5.6.13", "7.4.33", "8.1"]'
根据GitHub官方文档:
toJSON: returns a pretty-print JSON representation of valuefromJson: Returns a JSON object or JSON data type for value
错误原因
核心问题在于**toJson的参数使用错误**:
- 传入
toJson的是一个已转义的JSON字符串字面量('["7.4.10", "5.6.13", "7.4.33", "8.1"]'),而非原生的数组类型。 toJson会将这个字符串再次编码为JSON格式,导致最终输出的php-versions是一个双重编码的JSON字符串(即输出内容为"[\"7.4.10\",\"5.6.13\",\"7.4.33\",\"8.1\"]")。- 当
build作业用fromJson解析该输出时,得到的结果仍然是一个字符串(["7.4.10", "5.6.13", "7.4.33", "8.1"]),而非GitHub Workflow矩阵所需的数组类型,因此触发“Unexpected value”报错。
修正方案
直接将原生数组传入toJson,而非字符串字面量:
on: push: jobs: matrix: runs-on: ubuntu-latest name: Setup outputs: php-versions: ${{ toJson(['7.4.10', '5.6.13', '7.4.33', '8.1']) }} build: runs-on: ubuntu-latest needs: matrix strategy: fail-fast: false matrix: version: ${{ fromJson(needs.matrix.outputs.php-versions) }}
此时toJson会将原生数组编码为正确的JSON数组字符串,fromJson解析后得到的是数组类型,符合matrix参数的要求。
内容的提问来源于stack exchange,提问作者gremo
相关产品推荐
相关产品推荐

