我试图推翻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'
}
任何人都可以帮我解决这个棘手的问题吗?
答案 0 :(得分:2)
不要通过猴子修补let newIndexPath = IndexPath(row: selectedIndexPath.row, section: selectedIndexPath.section)
emojis[selectedIndexPath.section].append(emoji)
类来覆盖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