我试图推翻simplejson的默认编码器。我尝试了两种方法。
使用cls:
class ExtendedJSONEncoder(simplejson.JSONEncoder):
def default(self, obj):
if isinstance(obj, float):
return '{0:.8f}'.format(obj)
return super(ExtendedJSONEncoder, self).default(obj)
def save_signal(self, signal):
with open('test.json', 'w') as outfile:
outfile.write(simplejson.dumps(signal, cls=ExtendedJSONEncoder))
使用默认值:
def extended_JSONEncoder(obj):
if isinstance(obj, float):
return '{0:.8f}'.format(obj)
return simplejson.JSONEncoder.default(obj)
def save_signal(self, signal):
with open('test.json', 'w') as outfile:
outfile.write(simplejson.dumps(signal, default=extended_JSONEncoder))
在这两种情况下,都不会调用扩展的JSONEncoder。
这是我正在处理的数据的示例。
signal = {
'pair': 'BTC-XRP',
'term': None,
'exchange': None,
'entry_min': 8.5e-05,
'entry_max': None,
'stop_loss': None,
'targets': [9.4e-05, 0.000105, 0.000118],
'risk': 'medium',
'strategy': 'targets',
'enabled': True,
'test_mode': False,
'msg_id': 214,
'msg_timestamp': '2018-03-05 20:01:52',
'channel_id': '1234',
'channel_name': 'realtime_sig'
}
谁能帮助我解决这个令人发指的问题?
最佳答案
不要通过猴子修补default
类来覆盖JSONEncoder
编码器功能。如您所见,这不会起作用。而是将适当的函数传递给dump()
或dumps()
。
这是一个示范:
import simplejson
class C:
def __init__(self, item):
self.item = item
def json_encoder(obj):
print("WooWoo! Called!", obj)
if isinstance(obj, C):
return obj.item
raise TypeError(repr(obj) + " is not JSON serializable")
with open('save.json', 'w') as outfile:
outfile.write(simplejson.dumps([1,C(47),C('orange'),4], default=json_encoder))
不建议使用的替代方法是子类
JSONEncoder
并将结果类通过dumps()
参数传递给cls
。import simplejson
class C:
def __init__(self, item):
self.item = item
class json_encoder(simplejson.JSONEncoder):
def default(self, obj):
print("WooWoo! Called!", obj)
if isinstance(obj, C):
return obj.item
raise TypeError(repr(obj) + " is not JSON serializable")
with open('save.json', 'w') as outfile:
outfile.write(simplejson.dumps([1,C(47),C('orange'),4], cls=json_encoder))
关于python - 设置simplejson.JSONEncoder.default不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49162044/