在python中构造包含JSON数据的YAML

时间:2017-04-06 13:01:40

标签: python json dictionary yaml

我有一个文件config.json,其中包含一些JSON,如下所示:

{  
   "json":{  
      "type":"service",
      "project":"project",
      "key":"key",
      "client":"client"
   },
   "project_id":"1"
}

我想将此JSON数据包含在YAML文件中。

YAML看起来像这样(这是我要求的输出):

contexts:
- config:
    json: |
      {
        "type": "service",
        "project": "project",
        "key": "key",
        "client": "client"
      }
    project_id: "1"
  name: cloud
current-context: cloud

此处有两个键json& project_id来自config.json数据。 此JSON数据在config下添加为contexts

以下内容强调来自config.json数据的两个信息。

contexts:
- config:
    json: |
    ----
      {
      }
    project_id: "1"
    ----------
  name: cloud
current-context: cloud

我该怎么做?

我试过如下:

with open("config.json") as f:
    config = yaml.safe_load(f)

config_map = {}
for key in config:
    config_map[key] = str(config[key])

context = dict(
    config=config_map,
    name="cloud",
)

data = {
    "contexts": [context],
    "current-context": "cloud",
}

但这不正确。
谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

如果您真的想将键json的值转储为文字块样式标量,可以使用:

import sys
from ruamel import yaml

with open("config.json") as f:
    config = yaml.safe_load(f)

for key in config:
    try:
        int(config[key])
        val = yaml.scalarstring.DoubleQuotedScalarString(config[key])
    except TypeError:
        val = yaml.round_trip_dump(
            config[key], default_flow_style=True, width=10, default_style='"')
        val = val.replace('{"', '{\n  "').replace('"}', '"\n}')
        val = yaml.scalarstring.PreservedScalarString(val)
    config[key] = val

context = dict(
    config=config,
    name="cloud",
)

data = {
    "contexts": [context],
    "current-context": "cloud",
}

yaml.round_trip_dump(data, sys.stdout)

为您提供完全您所需的输出。您可能希望调整try语句,该语句确定呈现为双引号标量的内容,以及作为文字块标量的内容。