【问题标题】:How to link yaml key values to json key values in python如何将yaml键值链接到python中的json键值
【发布时间】:2016-07-22 15:53:16
【问题描述】:

您好,我想在 json 中使用 yaml 数据 例如。

json 文件:

{
    "Name": "foo",
    "Birthdate": "1/1/1991",
    "Address": "FOO_ADDRESS",
    "Note": "Please deliver package to foo at FOO_ADDRESS using COURIER service"
}

yaml 文件:

--- FOO_ADDRESS:“foo 车道,foo 状态” 快递:“食品”

有人可以指导我最有效的方法吗?在这个特定的示例中,我真的不需要使用单独的 yaml 文件(我理解)。但在我的具体情况下,我可能不得不这样做。

编辑:抱歉,我没有粘贴所需的输出文件

应该是这样的:

{
    "Name": "foo",
    "Birthdate": "1/1/1991",
    "Address": "foo lane, foo state",
    "Note": "Please deliver package to foo at foo lane, foo state using foodex service"
}

【问题讨论】:

  • 请更具体地说明您想要做什么。这个 JSON 文件是您的输入还是所需的输出?什么时候应该替换变量?正在加载?写作?如果可能,清楚地显示输入和期望的输出。
  • 对不起,我错过了。现已添加所需的输出。

标签: python json yaml


【解决方案1】:

为了安全起见,首先加载 JSON,然后在加载的字符串中进行替换。如果您在 JSON 源中进行替换,最终可能会得到无效的 JSON 输出(当替换字符串包含 " 或其他必须在 JSON 中转义的字符时)。

import yaml, json

def doReplacements(jsonValue, replacements):
  if isinstance(jsonValue, dict):
    processed = {doReplacements(key, replacements): \
        doReplacements(value, replacements) for key, value in \
        jsonValue.iteritems()}
    # Python 3: use jsonValue.items() instead
  elif isinstance(jsonValue, list):
    processed = [doReplacements(item, replacements) for item in jsonValue]
  elif isinstance(jsonValue, basestring):
    # Python 3: use isinstance(jsonValue, str) instead
    processed = jsonValue
    for key, value in replacements.iteritems():
      # Python 3: use replacements.items() instead
      processed = processed.replace(key, value)
  else:
    # nothing to replace for Boolean, None or numbers
    processed = jsonValue
  return processed

input = json.loads("""{
    "Name": "foo",
    "Birthdate": "1/1/1991",
    "Address": "FOO_ADDRESS",
    "Note": "Please deliver package to foo at FOO_ADDRESS using COURIER service"
}
""")

replacements = yaml.safe_load("""---
FOO_ADDRESS: "foo lane, foo state"
COURIER: "foodex"
""")

print json.dumps(doReplacements(input, replacements), indent=2)
# Python 3: `(...)` around print argument

使用json.loadjson.dump 来读取/写入文件而不是字符串。请注意,加载和写入 JSON 数据可能会更改对象中项目的顺序(无论如何您都不应依赖它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2019-08-22
    相关资源
    最近更新 更多