In Python können Sie im Gegensatz zu JavaScript nicht mit Attribut auf Wörterbuchelemente zugreifen. Das heißt, "dict_obj [" value "]" ist in Ordnung, aber nicht "dict_obj.value".
Dies ist die Unannehmlichkeit beim Arbeiten mit Json-Daten. Auf der JavaScript-Seite kann schließlich mit Attribut darauf zugegriffen werden. Es liegt also in der Natur des Menschen, auf die gleiche Weise schreiben zu wollen.
Deshalb zeige ich Ihnen, wie Sie mit einem Attribut auf das Diktat zugreifen (diesmal unter der Annahme eines Json-Objekts).
In Python wird Json durch das Laden zu einem Wörterbuch.
>>> import json
>>> json.loads('{"v1":"xxxx", "v2":"vvvv"}')
{'v1': 'vvvv', 'v2': 'xxxx'}
Wie oben erwähnt, erfolgt der Zugriff beim Zugriff in Form von "obj [" v1 "]" und "obj.vi" als NG.
Der einfachste Weg, dies zu lösen, ist die Verwendung einer Bibliothek namens attrdict.
Wenn Sie es jedoch nicht installieren möchten, können Sie die folgende einfache Methode verwenden. Wenn Sie "json.loads" ausführen, verwenden Sie "object_hook", um jedes Objekt in eine Klasse zu verpacken, die den Attributzugriff implementiert ("getattr"). Sie können jetzt über Attribut auf das Element zugreifen.
import json
class AttributeDict(object):
def __init__(self, obj):
self.obj = obj
def __getstate__(self):
return self.obj.items()
def __setstate__(self, items):
if not hasattr(self, 'obj'):
self.obj = {}
for key, val in items:
self.obj[key] = val
def __getattr__(self, name):
if name in self.obj:
return self.obj.get(name)
else:
return None
def fields(self):
return self.obj
def keys(self):
return self.obj.keys()
if __name__ == "__main__":
attribute_json = json.loads('{"v1":"xxxx", "v2":"vvvv"}', object_hook=AttributeDict)
print("attribute_json.v1 = {0}".format(attribute_json.v1))
json_with_array = json.loads('{"arr":[{"v":"xxxx"}, {"v":"vvvv"}]}', object_hook=AttributeDict)
print("json_with_array[0].v = {0}".format(json_with_array.arr[0].v))
Ausführungsergebnis
attribute_json.v1 = xxxx
json_with_array[0].v = xxxx
Wenn Sie auf Attribute zugreifen können, können Sie den Code vervollständigen, sodass die Implementierung einfacher ist. Ich versuchte es.
attrdict using JSON keys as python attributes in nested JSON soundcloud-python/resource.py Sample on Gist
Recommended Posts