Json 不仅可以用作 API 的通信工具,还可以用作将正在运行的程序配置为初始化的标记。
我遇到了出于重用目的在 json 架构中使用引用的情况。
由于 json 模式是有效的 json,我原本希望 python json 库能够扩展引用。
$ cat test.json
{
"template":{
"a":"a",
"b":"b",
"pi":3.14
},
"value": { "$ref":"#/template"}
}
python -c "from json import load; fp = open("test.json","r"); print(load(fp))"
{'template': {'a': 'a', 'b': 'b', 'pi': 3.14}, 'value': {'$ref': '#/template'}}
在 python 中扩展引用的最简单方法是什么,因为 python 字典不能指向它们自己的其他部分(我认为(?
json 库不支持引用,但 jsonref 支持。
jsonref
是一个用于自动取消引用 Python 的 JSON 引用对象的库(支持 Python 2.6+ 和 Python 3.3+(。
从文档中:
from pprint import pprint
import jsonref
# An example json document
json_str = """{"real": [1, 2, 3, 4], "ref": {"$ref": "#/real"}}"""
data = jsonref.loads(json_str)
pprint(data) # Reference is not evaluated until here
{'real': [1, 2, 3, 4], 'ref': [1, 2, 3, 4]}
感谢@FreshD,他带领我选择了可以像JSON一样加载和转储的YAML。
这就是我解决用例的方式,一开始是完全替代,但现在也支持继承。
$ cat test.yaml
template: &item
a: a
b: b
pi: 3.14
exact-value:
*item
inherited-value:
<<: *item
a : I changed
$ python -c "from yaml import load; fp = open("test.yaml","r"); print(load(fp))"
{'template': {'a': 'a', 'b': 'b', 'pi': 3.14}, 'exact-value': {'a': 'a', 'b': 'b', 'pi': 3.14}, 'inherited-value': {'a': 'I changed', 'b': 'b', 'pi': 3.14}}
我从未在 json 中使用/看到这些引用,但我知道并使用 YAML 中的引用进行配置。这是一个很好的描述,如何实现这一目标。