在JSON文件中使用变量

3 投票
1 回答
17639 浏览
提问于 2025-04-18 07:36

我需要在json文件中定义一个变量,然后在整个文件中使用它。

这是我的简单示例:(改编自 这里

{
  "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`}}"
  }
}

对象 objectBobjectAaccess_key 字段必须等于 "abc",这个值是我在文件开头定义的。

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

1 个回答

10

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"
 }
}

撰写回答