<p>在生成JSON(基于测试示例)时,您似乎在尝试将浮点值向下舍入到4个小数点。在</p>
<p>python2.7附带的<code>JSONEncoder</code>没有have <code>_iterencode</code>方法,所以它没有被调用。另外,快速浏览一下<code>json/encoder.py</code>可以看出,这个类的编写方式使得更改float编码行为变得非常困难。也许,在进行JSON序列化之前,最好是分离关注点,并取整浮动。在</p>
<p><strong>编辑</strong>:Alex Martelli还在<a href="https://stackoverflow.com/questions/1447287/format-floats-with-standard-json-module">a related answer.</a>中提供了一个monkey-patch解决方案。该方法的问题是,您引入了一个对<code>json</code>库行为的全局修改,这可能会无意中影响应用程序中的其他代码段,而这些代码是在假定浮点编码时没有舍入的情况下编写的。在</p>
<p>试试这个:</p>
<pre><code>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()
</code></pre>