So, nächstes Problem. Ich habe jetzt meine Catalog-Klasse von list abgeleitet um das ganze ein bisschen besser nutzbar zu machen. Der Code inkl. Beispiel sieht jetzt so aus:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, json
from pprint import pprint
class Catalog(list):
def __init__(self, name, comment="", data=[]):
list.__init__(self, data)
self.name = name
self.comment = comment
self.append(["hängen", "colgar", 0])
self.append(["essen", "comer", 0])
self.append(["arbeiten", "trabajar", 0])
self.append(["sitzen", "sentar", 0])
def __repr__(self):
return '<%s name:%r comment:%r words:%s>' % (
self.__class__.__name__, self.name, self.comment, list(self)
)
def to_json(pobject):
print pobject.__class__
if isinstance(pobject, Catalog):
data = {"name": pobject.name, "comment": pobject.comment}
pprint(data)
return {'__class__': "Catalog",
'__value__': {"metadata": data, "content": pobject}}
raise TypeError(repr(pobject) + ' is not JSON serializable')
def from_json(json_object):
if "__class__" in json_object and json_object["__class__"] == "Catalog":
data = json_object["__value__"]
metadata = data["metadata"]
return Catalog(metadata["name"], metadata["comment"], data["content"])
return json_object
with open("json.test", "w") as f:
c = Catalog("test", "blah")
print c
json.dump(c, f, default=to_json, indent=2, encoding="UTF-8")
print "dumped"
with open('json.test', 'r') as f:
entry = json.load(f, object_hook=from_json, encoding="UTF-8")
print entry.name
pprint (entry)
Der Output ist folgender:
Code: Alles auswählen
python catalog.py
<Catalog name:'test' comment:'blah' words:[['h\xc3\xa4ngen', 'colgar', 0], ['essen', 'comer', 0], ['arbeiten', 'trabajar', 0], ['sitzen', 'sentar', 0]]>
dumped
Traceback (most recent call last):
File "catalog.py", line 49, in <module>
print entry.name
AttributeError: 'list' object has no attribute 'name'
Es scheint so, als würde meine Serialisierungsfunktion gar nciht mehr genutzt werden, weil nie die Klasse von pobject ausgegeben wird. Meinungen dazu?