将特定YAML转换为JSON

时间:2018-03-08 10:06:45

标签: json yaml jsonparser

我们说我有以下特定的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"
        }

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

1 个答案:

答案 0 :(得分:2)

您的YAML无效。引自YAML spec

  

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"
      }
    }
  }
}
相关问题