gpt4 book ai didi

python - 创建自定义 JSONEncoder

转载 作者:太空狗 更新时间:2023-10-29 21:57:30 28 4
gpt4 key购买 nike

我正在运行 Python 2.7,我正在尝试创建 JSONEncoder 的自定义 FloatEncoder 子类。我遵循了许多示例,例如 this,但似乎都不起作用。这是我的 FloatEncoder 类:

class FloatEncoder(JSONEncoder):
def _iterencode(self, obj, markers=None):
if isinstance(obj, float):
return (str(obj) for obj in [obj])
return super(FloatEncoder, self)._iterencode(obj, markers)

这里是我调用 json.dumps 的地方:

with patch("utils.fileio.FloatEncoder") as float_patch:
for val,res in ((.00123456,'0.0012'),(.00009,'0.0001'),(0.99999,'1.0000'),({'hello':1.00001,'world':[True,1.00009]},'{"world": [true, 1.0001], "hello": 1.0000}')):
untrusted = dumps(val, cls=FloatEncoder)
self.assertTrue(float_patch._iterencode.called)
self.assertEqual(untrusted, res)

第一个断言失败,意味着 _iterencode 没有被执行。阅读 JSON 文档后,我尝试覆盖 default() 方法,但也没有被调用。

最佳答案

在生成 JSON(基于测试示例)时,您似乎试图将浮点值四舍五入到小数点后 4 位。

Python 2.7 附带的

JSONEncoder 没有 have _iterencode 方法,所以这就是它没有被调用的原因。另外,快速浏览一下 json/encoder.py 就会发现,此类的编写方式使得很难更改浮点编码行为。也许,在进行 JSON 序列化之前分离关注点并舍入 float 会更好。

编辑:Alex Martelli 还在 a related answer. 中提供了猴子补丁解决方案。该方法的问题是您正在对 json 库行为进行全局修改,这可能无意中影响了应用程序中的其他一些代码,这些代码是在假设 float 编码时没有舍入的情况下编写的。

试试这个:

from collections import Mapping, Sequence
from unittest import TestCase, main
from json import dumps

def round_floats(o):
if isinstance(o, float):
return round(o, 4)
elif isinstance(o, basestring):
return o
elif isinstance(o, Sequence):
return [round_floats(item) for item in o]
elif isinstance(o, Mapping):
return dict((key, round_floats(value)) for key, value in o.iteritems())
else:
return o

class TestFoo(TestCase):
def test_it(self):
for val, res in ((.00123456, '0.0012'),
(.00009, '0.0001'),
(0.99999, '1.0'),
({'hello': 1.00001, 'world': [True, 1.00009]},
'{"world": [true, 1.0001], "hello": 1.0}')):
untrusted = dumps(round_floats(val))
self.assertEqual(untrusted, res)

if __name__ == '__main__':
main()

关于python - 创建自定义 JSONEncoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413891/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com