【问题标题】:Construct YAML that contains JSON data in python在 python 中构造包含 JSON 数据的 YAML
【发布时间】:2017-09-01 12:47:24
【问题描述】:

我有一个文件 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

这里,两个键 jsonproject_id 来自 config.json 数据。 此 JSON 数据在contexts 下添加为config

以下强调来自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",
}

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

【问题讨论】:

    标签: python json dictionary yaml


    【解决方案1】:

    如果您真的想将键 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 语句,该语句确定将什么呈现为双引号标量,以及将什么呈现为文字块标量。

    【讨论】:

    • 在配置下,json键的值将是字符串。我的意思是完整的 json 将是字符串格式。
    • 我实际上并不关心整数/字符串部分。修复了我使用project_id 作为字符串的问题。我实际上需要在 YAML 中嵌入 JSON。就像我指出的那样输出
    • @AerofoilKite 我更新了最终程序以准确生成您所需的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2021-05-10
    相关资源
    最近更新 更多