设置simplejson.JSONEncoder.default不起作用

时间:2018-03-07 22:11:11

标签: python encoding simplejson

我试图推翻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'
}

任何人都可以帮我解决这个棘手的问题吗?

1 个答案:

答案 0 :(得分:2)

不要通过猴子修补let newIndexPath = IndexPath(row: selectedIndexPath.row, section: selectedIndexPath.section) emojis[selectedIndexPath.section].append(emoji) 类来覆盖default编码器功能。正如您所见,这不会产生任何影响。而是将适当的函数传递给JSONEncoderdump()

这是一个演示:

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