就像标题所说的那样,我正在尝试为一个对象编写自定义解码器,该对象的类是我定义的,其中包含我定义的类的其他对象。 “外部”类是一个边缘,定义如下:
class Edge:
def __init__(self, actor, movie):
self.actor = actor
self.movie = movie
def __eq__(self, other):
if (self.movie == other.movie) & (self.actor == other.actor):
return True
else:
return False
def __str__(self):
print("Actor: ", self.actor, " Movie: ", self.movie)
def get_actor(self):
return self.actor
def get_movie(self):
return self.movie
“内部”类 actor 和 movies 的定义如下:
class Movie:
def __init__(self, title, gross, soup, year):
self.title = title
self.gross = gross
self.soup = soup
self.year = year
def __eq__(self, other):
if self.title == other.title:
return True
else:
return False
def __repr__(self):
return self.title
def __str__(self):
return self.title
def get_gross(self):
return self.gross
def get_soup(self):
return self.soup
def get_title(self):
return self.title
def get_year(self):
return self.year
class Actor:
def __init__(self, name, age, soup):
self.name = name
self.age = age
self.soup = soup
def __eq__(self, other):
if self.name == other.name:
return True
else:
return False
def __repr__(self):
return self.name
def __str__(self):
return self.name
def get_age(self):
return self.age
def get_name(self):
return self.name
def get_soup(self):
return self.soup
(soup 只是那个电影/演员的维基百科页面的 beautifulsoup 对象,可以忽略)。我也为边缘类编写了一个自定义编码器:
class EdgeEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Edge):
return {
"Actor": {
"Name": o.get_actor().get_name(),
"Age": o.get_actor().get_age()
},
"Movie": {
"Title": o.get_movie().get_title(),
"Gross": o.get_movie().get_gross(),
"Year": o.get_movie().get_year()
}
}
return json.JSONEncoder.default(self, o)
我已经测试过了,它正确地将边缘列表序列化为 JSON 文件。现在我的问题出现在尝试编写边缘解码器时。我在 这里 使用了 GitHub 页面作为参考,但是我的编码器偏离了他,我想知道是否有必要更改它。我是否需要像他那样在其 JSON 序列化中将对象的类型显式编码为其自己的键值对,或者是否有某种方法可以通过边缘的序列化来获取“Actor”和“Movie”键?同样,有没有办法抢“名字”? “年龄”等,以便我可以重建 Actor/Movie 对象,然后使用它们来重建边缘?有没有更好的方法来对我的对象进行编码?我也尝试过按照 本 教程进行操作,但我发现使用对象指令会使他们的编码器感到困惑,而且我不确定如何将该方法扩展到包含自定义对象的自定义对象。
原文由 lmotl3 发布,翻译遵循 CC BY-SA 4.0 许可协议
您引用的编码器/解码器示例( 此处)可以轻松扩展以允许 JSON 输入/输出中的不同类型的对象。
但是,如果您只想要一个简单的解码器来匹配您的编码器(只在 JSON 文件中编码 Edge 对象),请使用此解码器:
Using the code from the question to define classes
Movie
,Actor
,Edge
, andEdgeEncoder
, the following code will output a test file ,然后读回: