我有一个根类,College
至极拥有许多Course
类为什么JSONDecoder直观地将json字符串反序列化为Python对象?
class Course:
def __init__(self, name, url, hidden, semester="SS16"):
self.name = name
self.url = url
self.hidden = hidden
self.semester = semester
def __str__(self):
return ('Course: (Name: %s, Semester: %s, url: %s, hidden: %s)' % (self.name, self.semester, self.url, str(self.hidden)))
class College:
def __init__(self, url='http://dummy', courses=set()):
self.url = url
self.courses = courses
def __str__(self):
s = ('College: (url: %s, Courses:[' % (self.url))
s += ', '.join(str(v) for v in self.courses)
return s + "])"
现在我想保存/从JSON文件加载我的大学课堂到/。对于编码我创建了一个自定义的JSONEncoder
类,这似乎很好地工作:
from json import JSONEncoder
from json import JSONDecoder
class CollegeEncoder(JSONEncoder):
def default(self, o):
courses = list(map(lambda v: {'name': v.name, 'url': v.url,
'hidden': v.hidden, 'semester': v.semester}, o.courses))
return {'url': o.url, 'courses': courses}
对于解码我写了一个简单的函数:
def from_json(dct):
if 'url' in dct:
return College(dct['url'])
现在,如果我测试JSON编码/这样解码:
myCollege = College()
myCollege.courses.add(Course("Course1", "url1", False))
myCollege.courses.add(Course("Course2", "url2", False))
myCollege.courses.add(Course("Course3", "url3", False))
dump = CollegeEncoder().encode(myCollege)
college = JSONDecoder(object_hook=from_json).decode(dump)
print(college)
在这一点上,预计只有一个简单的学院对象只有网址,但我得到了我的整个学院的所有课程和他们的属性
College: (url: http://dummy, Courses:[Course: (Name: Course1, Semester: SS16,
url: url1, hidden: False), Course: (Name: Course2, Semester: SS16, url: url2,
hidden: False), Course: (Name: Course3, Semester: SS16, url: url3, hidden: False)])
但我不明白我的'object_hook'函数如何知道如何反序列化子类。 我应该保持这种方式还是扩大自定义反序列化?我怎么能阻止我的from_json
函数默认行为?
谢谢!这很有帮助! –