设置simplejson.JSONEncoder.default不起作用

2024-09-28 03:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图否决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))

使用默认值:

^{pr2}$

在这两种情况下都不调用扩展的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'
}

有人能帮我解决这个令人恼火的问题吗?在


Tags: testselfnoneobjdefaultsignalreturndef
1条回答
网友
1楼 · 发布于 2024-09-28 03:19:44

不要通过猴子修补JSONEncoder类来重写default编码器函数。如你所见,那不会有任何效果。相反,请将适当的函数传递给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,并通过cls参数将结果类传递给dumps()。在

^{pr2}$

相关问题 更多 >

    热门问题