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

10-10 14:28