在json文件中使用变量

时间:2014-05-26 12:11:29

标签: python json

我需要定义一次变量并在整个json文件中使用它。

这是我的MWE :(改编自here

{
  "variables": {
    "my_access_key": "abc",
    "my_secret_key": "def"
  },
  "objectB": {
    "type": "1",
    "access_key": "{{user `my_access_key`}}",
    "secret_key": "{{user `my_secret_key`}}"
  },
  "objectA": {
    "type": "2",
    "access_key": "{{user `my_access_key`}}",
    "secret_key": "{{user `my_secret_key`}}"
  }
}

对象access_keyobjectB的{​​{1}}字段必须等于“objectA”,这是我在文件开头定义的。

如何在python中实现这个目标?

1 个答案:

答案 0 :(得分:7)

JSON不允许变量引用

在YAML中,您可以定义变量,为它们设置引用名称,然后在文件中重复使用它们。

JSON不提供此类功能,您必须逐个地设置这些值。

以编程方式构建JSON

import json

access = "AAA"
secret = "XXX"

dct = {"variables": {"my_access_key": access, "my_secret_key": secret},
       "objectB": {"type": "1", "access_key": access, "secret_key": secret},
       "objectA": {"type": "2", "access_key": access, "secret_key": secret}
      }
json_str = json.dumps(dct, indent=True)
print json_str

打印什么

{
 "objectA": {
  "access_key": "AAA", 
  "secret_key": "XXX", 
  "type": "2"
 }, 
 "variables": {
  "my_secret_key": "XXX", 
  "my_access_key": "AAA"
 }, 
 "objectB": {
  "access_key": "AAA", 
  "secret_key": "XXX", 
  "type": "1"
 }
}

使用YAML锚点和引用

您可以将YAML功能用于此目的。由于YAML很容易编辑,因此它可能是配置文件的好选择。

在使用它之前,请确保安装pyyaml:

$ pip install pyyaml

然后是代码(在variables中修改了名称以满足我们的需要):

import json
import yaml
yaml_str = """
variables: &keys
    access_key: abc
    secret_key: def
objectB:
    <<: *keys
    type: "1"
objectA:
    <<: *keys
    type: "2"
"""

dct = yaml.load(yaml_str)
json_str = json.dumps(dct, indent=True)
print json_str

打印

{
 "objectA": {
  "access_key": "abc", 
  "secret_key": "def", 
  "type": "2"
 }, 
 "variables": {
  "access_key": "abc", 
  "secret_key": "def"
 }, 
 "objectB": {
  "access_key": "abc", 
  "secret_key": "def", 
  "type": "1"
 }
}