Python 中的 JSON 引用提取



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 中的引用进行配置。这是一个很好的描述,如何实现这一目标。

最新更新