据我所知,JSON 标准中没有任何内容可供参考。我的第一个建议是使用YAML,它确实以Node Anchors的形式引用。Python 有一个很好的 YAML 实现,它支持这些。
话虽如此,如果您打算使用 JSON,则必须推出自己的实现。
一个可能的例子(虽然这并没有通过引用数组扩展当前数组,因为在 dicts 的情况下这是不明确的,它用它引用的值替换引用)如下。请注意,它不处理格式错误的引用,您必须自己添加错误检查或保证没有格式错误的引用。如果您想将其更改为扩展而不是替换,您可以,但您比我更了解您的用例,因此您可以通过这种方式指定它。这是为了给你一个起点。
def resolve_references(structure, sub_structure=None):
if sub_structure is None:
return resolve_references(structure, structure)
if isinstance(sub_structure, list):
tmp = []
for item in sub_structure:
tmp.append(resolve_references(structure, item))
return tmp
if isinstance(sub_structure, dict):
tmp = {}
for key,value in sub_structure.items():
tmp[key] = resolve_references(structure, value)
return tmp
if isinstance(sub_structure, str) or isinstance(sub_structure, unicode):
if sub_structure[0] != "$":
return sub_structure
keys = sub_structure[1:].split(".")
def get_value(obj, key):
if isinstance(obj, dict):
return obj[key]
if isinstance(obj, list):
return obj[int(key)]
return value
value = get_value(structure, keys[0])
for key in keys[1:]:
value = get_value(value, key)
return value
return sub_structure
示例用法:
>>> import json
>>> json_str = """
... {
... "dictionary" : {
... "list_1" : [
... "item_1"
... ],
...
... "list_2" : "$dictionary.list_1"
... }
... }
... """
>>> obj = json.loads(json_str)
>>> resolve_references(obj)
{u'dictionary': {u'list_2': [u'item_1'], u'list_1': [u'item_1']}}