发生观察到的行为是因为值gtk.PAGE_ORIENTATION_LANDSCAPE
是一个实例class 'gtk._gtk.PageOrientation'
它继承了type 'gobject.GEnum'
反过来又继承了type 'int'
.
所以你的 GTK 枚举是整数,并且 json 代码假设它可以处理整数,因此不会调用default
你的编码器的方法。
不幸的是,当前的 json 实现对于编码子类类型没有那么有帮助,如下所示:-/没有继承和重写使这成为可能(至少我找不到任何解决方案)。检查值的硬编码位置太多isinstance(value, (int, long))
.
But you can当然,修补 json 编码器的源代码即可实现您的目标,而无需重新实现整个 json 功能。为此复制文件encoder.py
来自 json 库(对我来说这是/usr/lib/python2.7/json/encoder.py
)到您的工作目录并修补它。
在函数中_iterencode_list()
and _iterencode_dict()
(它们是本地函数_make_iterencode()
)你可以找到类型检查int
or long
;如果是这样,当前的实现只是调用str(value)
。将其更改为encodeInt(value)
(在三个地方!)并实现您自己的encodeInt()
函数于encoder.py
:
def encodeInt(value):
try:
return value.value_name
except:
return str(value)
然后,在原始代码中,您必须直接导入该修补文件:
import encoder
并且您必须确保不再使用 C 实现,而是使用修补后的代码。 (您会看到,通常使用(更快的)C 实现,而我们修补某些内容的 Python 代码则不是。)要实现此目的,只需在导入后添加:
encoder.c_make_encoder = None
现在可以使用您的修补编码器:
print encoder.JSONEncoder().encode({
gtk.PAGE_ORIENTATION_PORTRAIT: [
gtk.PAGE_ORIENTATION_LANDSCAPE
],
gtk.PAGE_ORIENTATION_LANDSCAPE: gtk.PAGE_ORIENTATION_PORTRAIT })
prints:
{"GTK_PAGE_ORIENTATION_PORTRAIT": [GTK_PAGE_ORIENTATION_LANDSCAPE], "GTK_PAGE_ORIENTATION_LANDSCAPE": GTK_PAGE_ORIENTATION_PORTRAIT}
请注意,Json 字典键始终必须是字符串。这就是为什么您的值在用作键时会得到双引号。但这也是命运的常态int
s — 当用作密钥时 — 共享。它们也会被字符串化。
你可以看看http://pastebin.com/2HAtN9E8 http://pastebin.com/2HAtN9E8查看所有来源。