You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab流水线中多JSON转合并YAML列表的yq实现问题

GitLab流水线中合并多结构JSON为单YAML列表的yq优化方案

在GitLab流水线任务中,我有一批键结构不统一的JSON文件,需要将它们转换为YAML格式后合并到同一个YAML文件的指定根节点下,要求以去除后缀的文件名作为嵌套键。当前用yq处理后会生成多段独立的YAML文档,希望优化命令直接生成单列表结构,避免后续用awk二次处理。

示例输入JSON

文件1(nameOfTheJsonFile1.json):

{
    "displayName": "Basic JSON 1",
    "dFilters": [],
    "description": "",
    "labels": {
        "overview": "",
        "specific": "",
        "team": ""
    },
    "layout": {}
}

文件2(nameOfTheJsonFile2.json):

{
    "displayName": "Basic JSON 2",
    "cFilters": [],
    "description": "",
    "labels": {
        "overview": "",
        "specific": "",
        "team": ""
    },
    "map": {}
}

期望输出YAML

result:
  nameOfTheJsonFile1:
    displayName: Basic JSON 1
    dFilters: []
    description: ''
    labels:
      overview: ''
      specific: ''
      team: ''
    layout: {}
  nameOfTheJsonFile2:
    displayName: Basic JSON 2
    cFilters: []
    description: ''
    labels:
      overview: ''
      specific: ''
      team: ''
    map: {}

优化后的yq命令

使用mikefarah/yq v4+版本执行以下命令,可直接生成符合要求的单文档YAML:

yq eval-all '
  reduce (
    inputs | 
    {"key": filename | split(".") | .[0], "value": .}
  ) as $item (
    {}; 
    .result[$item.key] = $item.value
  )
' *.json > merged.yaml

命令说明

  • eval-all:告知yq处理所有输入的JSON文件
  • inputs | {"key": filename | split(".") | .[0], "value": .}:对每个输入文件,生成包含两个字段的对象:key是去除后缀的文件名,value是JSON转换后的YAML内容
  • reduce ... as $item ({}; .result[$item.key] = $item.value):遍历所有生成的对象,将它们合并到根节点result下,以key作为嵌套键

执行该命令后,所有JSON会被一次性转换并合并为单段YAML文档,无需额外的awk处理。

内容的提问来源于stack exchange,提问作者Zanndorin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 19:33:13