我想将字典转换为带有布尔值的 JSON 字符串True
值转换为数字1
和布尔值False
值转换为数字0
。我正在使用一个JSONEncoder
子类,但它似乎忽略布尔值......
import json
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bool):
return 1 if obj else 0
return super().default(obj)
data = { 'key-a' : 'a', 'key-true' : True, 'key-false' : False }
jsondata = json.dumps(data, cls=MyEncoder)
print(jsondata)
我希望这是结果:
{"key-true": 1, "key-a": "a", "key-false": 0}
然而,这就是我得到的:
{"key-true": true, "key-a": "a", "key-false": false}
我知道我可以在将数据传递给之前以编程方式修改数据json.dumps
,但是有什么方法可以通过a获得我想要的结果JSONEncoder
子类?
The default()
的方法JSONEncoder
仅当编码器遇到它不知道如何序列化的对象时才调用子类。
不幸的是,官方文档 https://docs.python.org/3/library/json.html#json.JSONEncoder并没有说得很清楚。它被提及,但在类构造函数的“关键字参数”部分中,而不是在该方法的文档中:
如果指定的话,default应该是一个为无法序列化的对象调用的函数。它应该返回对象的 JSON 可编码版本或引发TypeError
。如果没有指定,TypeError
被提出。
这种行为很容易被验证:
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bool):
print('got bool')
return 1 if obj else 0
if isinstance(obj, Foo):
print('got Foo')
return {'__Foo__': id(obj)}
print('got unknown')
return super().default(obj)
>>> class Foo: pass
...
>>> s = json.dumps({'a': False, 'b': True, 'c': Foo()}, cls=MyEncoder)
got Foo
>>> s
'{"a": false, "c": {"__Foo__": 140636444256856}, "b": true}'
JSONEncoder
并不是为了轻易地允许覆盖它已经知道如何序列化的对象的序列化(这是一件好事:像 JSON 这样的标准的全部要点是它们,嗯,standard)......所以如果你真的想像整数一样对布尔值进行编码,最简单的方法可能是按照你的问题中的建议预处理数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)