擅长:python、mysql、java
<p>这里的问题是<code>isinstance(ui_flags, int)</code>是真的,这意味着对整数使用了<em>标准</em>编码。您的自定义编码器永远不会被调用,因为内置编码器“知道”如何处理整数:</p>
<pre><code>>>> isinstance(UiFlags.Checked, IntEnum)
True
>>> isinstance(UiFlags.Checked, int)
True
</code></pre>
<p>在<code>JSONEncoder</code>级别有解决方法;您可以对结构进行预处理:</p>
^{pr2}$
<p>并将其应用到要编码的数据上,然后再将其应用到JSON编码之前:</p>
<pre><code>json.dumps(map_intenum(data), cls=CObjectsEncoder)
</code></pre>
<p>下一步是重写<code>JSONEncoder.iterencode()</code>并在编码之前应用转换:</p>
<pre><code>class CObjectsEncoder(json.JSONEncoder):
def iterencode(self, o, _one_shot=False):
o = map_intenum(o)
return super(CObjectsEncoder, self).iterencode(o, _one_shot)
def default(self, o):
if isinstance(o, Enum):
return {'__class__': o.__class__.__name__,
'__value__': (o.value,)}
return super(CObjectsEncoder, self).default(o)
</code></pre>