0

假设我有以下特定的 YAML 文件:

  task:
    container:
      image: ubuntu:latest
      args: tail
      args: -f
      args: /dev/null
      mounts:
        source: /home/testVolume
        target: /opt

使用 ruby​​ 命令ruby -ryaml -rjson -e 'puts JSON.pretty_generate(YAML.load(ARGF))' test.yml > testTab.json我只打印了最后一个参数:

    "task": {
      "container": {
        "image": "ubuntu:latest",
        "args": "/dev/null",
        "mounts": {
          "source": "/home/testVolume",
          "target": "/opt"
        }

我的问题是如何打印所有三个参数而不是只打印最后一个?

4

1 回答 1

2

您的 YAML 无效。引用YAML 规范

JSON 的 RFC4627 要求映射键仅“应该”是唯一的,而 YAML 坚持它们“必须”是唯一的。因此,从技术上讲,YAML 符合 JSON 规范,选择将重复项视为错误。实际上,由于 JSON 对此类重复项的语义保持沉默,因此唯一可移植的 JSON 文件是那些具有唯一键的文件,因此它们是有效的 YAML 文件。

在 YAML 映射中有多个相同的键是错误的。然而,JSON 允许这样做,因为它只声明它们应该是唯一的。因此,如果实现支持它,则生成的 JSON 将是有效的,但请注意它不是必需的。

您的问题的答案是:它不起作用,因为您的输入不是有效的 YAML。选择一个可以在 YAML 中表示的结构,然后它就会起作用。例如:

task:
  container:
    image: ubuntu:latest
    args:
    - tail
    - -f
    - /dev/null
    mounts:
      source: /home/testVolume
      target: /opt

生成的 JSON:

{
  "task": {
    "container": {
      "image": "ubuntu:latest",
      "args": [
        "tail",
        "-f",
        "/dev/null"
      ],
      "mounts": {
        "source": "/home/testVolume",
        "target": "/opt"
      }
    }
  }
}
于 2018-03-08T10:21:25.120 回答