【发布时间】:2014-02-06 14:47:17
【问题描述】:
我必须将自定义 GTK 元素的各种属性保存到文件中以备将来使用,并决定使用 JSON,因为 dicts 的格式和嵌套简单。
许多属性都是 GTK 枚举,例如 gtk.PAGE_ORIENTATION_PORTRAIT、gtk.ANCHOR_CENTER 和 pango.ALIGN_LEFT。它们有一个唯一的名称,可以使用 obj.value_name 检索以获取有效的 JSON 类型。
目前我的每个元素都有 2 种方法:to_str() 获取 value_name 和 from_str() 再次将 str 映射到枚举。我想自动化这个,所以我不会忘记调用这些并清理一下代码。 JSONEncoder 和 JSONDecodr 正是这样做的,或者我认为......
这是 Python 文档中给出的示例,它按预期工作。
import json
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
print "default method called for:", obj
if isinstance(obj, complex):
return [obj.real, obj.imag]
return json.JSONEncoder.default(self, obj)
print json.dumps(2 + 1j, cls=ComplexEncoder)
基于此示例,我添加了 GTK 枚举:
import json
import gtk
ENUMS = [gtk.PAGE_ORIENTATION_PORTRAIT, gtk.PAGE_ORIENTATION_LANDSCAPE]
class GtkEncoder(json.JSONEncoder):
def default(self, obj):
print "default method called for:", obj
if obj in ENUMS:
return obj.value_name
return json.JSONEncoder.default(self, obj)
print json.dumps(gtk.PAGE_ORIENTATION_LANDSCAPE, cls=GtkEncoder)
注意default 方法中添加的打印语句。在原始示例中,调用此方法没有问题,但在 GTK 示例中则没有。 default 方法永远不会被调用,它会返回 <enum GTK_PAGE_ORIENTATION_LANDSCAPE of type GtkPageOrientation> 这当然不是有效的 JSON。
那么,有没有办法自动编码/解码这些枚举,还是我坚持当前的手动方法?请注意,我要转储的数据结构不是单个值,而是一个或多个字典。
【问题讨论】: