gpt4 book ai didi

json - 使用 JSON 键作为嵌套 JSON 中的属性

转载 作者:太空狗 更新时间:2023-10-29 20:42:47 24 4
gpt4 key购买 nike

我在 python 2.7 中使用类似 JSON 的嵌套数据结构,我与一些外部 perl 代码进行交换。我只想以更 pythonic 的方式“处理”这些列表和字典的嵌套结构。

所以如果我有这样的结构...

a = {
'x': 4,
'y': [2, 3, { 'a': 55, 'b': 66 }],
}

...我希望能够在 python 脚本中处理它,就像它是嵌套的 python 类/结构一样,如下所示:

>>> aa = j2p(a)  # <<- this is what I'm after.
>>> print aa.x
4
>>> aa.z = 99
>>> print a
{
'x': 4,
'y': [2, 3, { 'a': 55, 'b': 66 }],
'z': 99
}

>>> aa.y[2].b = 999

>>> print a
{
'x': 4,
'y': [2, 3, { 'a': 55, 'b': 999 }],
'z': 99
}

因此 aa 是原始结构的代理。这是我到目前为止想出的,灵感来自优秀的 What is a metaclass in Python?问题。

def j2p(x):
"""j2p creates a pythonic interface to nested arrays and
dictionaries, as returned by json readers.

>>> a = { 'x':[5,8], 'y':5}
>>> aa = j2p(a)
>>> aa.y=7
>>> print a
{'x': [5, 8], 'y':7}
>>> aa.x[1]=99
>>> print a
{'x': [5, 99], 'y':7}

>>> aa.x[0] = {'g':5, 'h':9}
>>> print a
{'x': [ {'g':5, 'h':9} , 99], 'y':7}
>>> print aa.x[0].g
5
"""
if isinstance(x, list):
return _list_proxy(x)
elif isinstance(x, dict):
return _dict_proxy(x)
else:
return x

class _list_proxy(object):
def __init__(self, proxied_list):
object.__setattr__(self, 'data', proxied_list)
def __getitem__(self, a):
return j2p(object.__getattribute__(self, 'data').__getitem__(a))
def __setitem__(self, a, v):
return object.__getattribute__(self, 'data').__setitem__(a, v)


class _dict_proxy(_list_proxy):
def __init__(self, proxied_dict):
_list_proxy.__init__(self, proxied_dict)
def __getattribute__(self, a):
return j2p(object.__getattribute__(self, 'data').__getitem__(a))
def __setattr__(self, a, v):
return object.__getattribute__(self, 'data').__setitem__(a, v)


def p2j(x):
"""p2j gives back the underlying json-ic json-ic nested
dictionary/list structure of an object or attribute created with
j2p.
"""
if isinstance(x, (_list_proxy, _dict_proxy)):
return object.__getattribute__(x, 'data')
else:
return x

现在我想知道是否有一种优雅的方式来映射一整套__*__ 特殊函数,比如__iter____delitem__ ?所以我不需要使用 p2j() 解包来迭代或做其他 pythonic 的东西。

# today:
for i in p2j(aa.y):
print i
# would like to...
for i in aa.y:
print i

最佳答案

我认为您使它变得比需要的更复杂。如果我理解正确的话,你需要做的就是:

import json

class Struct(dict):
def __getattr__(self, name):
return self[name]

def __setattr__(self, name, value):
self[name] = value

def __delattr__(self, name):
del self[name]

j = '{"y": [2, 3, {"a": 55, "b": 66}], "x": 4}'

aa = json.loads(j, object_hook=Struct)

for i in aa.y:
print(i)

加载 JSON 时,object_hook 参数允许您指定一个可调用对象来处理它加载的对象。我刚刚用它把 dict 变成一个允许属性访问其键的对象。 Docs

关于json - 使用 JSON 键作为嵌套 JSON 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10026797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com