相关疑难解决方法(0)

Python JSON序列化一个Decimal对象

我有一个Decimal('3.9')对象的一部分,并希望将其编码为一个看起来像的JSON字符串{'x': 3.9}.我不关心客户端的精度,所以浮动很好.

是否有一种很好的方法来序列化这个?JSONDecoder不接受Decimal对象,并且事先转换为float会产生{'x': 3.8999999999999999}错误,并且会大大浪费带宽.

python floating-point json decimal

207
推荐指数
12
解决办法
17万
查看次数

在 python json.dumps 输出中禁用科学记数法

json.dumps 使用科学记数法输出小的浮点数或十进制值,这对于将此输出发送到的 json-rpc 应用程序是不可接受的。

>>> import json
>>> json.dumps({"x": 0.0000001})
'{"x": 1e-07}'
Run Code Online (Sandbox Code Playgroud)

我想要这个输出:

'{"x": 0.0000001}'
Run Code Online (Sandbox Code Playgroud)

最好避免引入额外的依赖项。

python json scientific-notation

10
推荐指数
1
解决办法
4994
查看次数

十进制到JSON

我从数据库中提取一个十进制值的总和.我正在尝试在JSON结果中使用该值

json.dumps( { 'sum': amount } ) #where amount is my Decimal
Run Code Online (Sandbox Code Playgroud)

Django无法序列化Decimal.我可以将它转换为字符串,但我想在JSON中使用数字类型.如果我尝试将其转换为float最终超过2位小数.

如果可能,需要发生什么才能获得如下结果?

{ 'sum': 500.50 }
Run Code Online (Sandbox Code Playgroud)

python django

9
推荐指数
1
解决办法
1万
查看次数

创建自定义JSONEncoder

我正在运行Python 2.7,我正在尝试创建一个JSONEncoder的自定义FloatEncoder子类.我跟着很多例子,如,但似乎没有工作.这是我的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)
Run Code Online (Sandbox Code Playgroud)

这里是我调用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)
Run Code Online (Sandbox Code Playgroud)

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

python json

7
推荐指数
1
解决办法
4881
查看次数

有没有办法覆盖python的json处理程序?

我在json编码无限时遇到了麻烦.

json.dumps将它转换为"Infinity",但我希望它将它转换null为我选择的另一个值.

不幸的是,default如果转储尚未理解该对象,则设置参数似乎也有效,否则默认处理程序似乎被绕过.

有没有一种方法可以预编码对象,更改类型/类编码的默认方式,或者在正常编码之前将某个类型/类转换为不同的对象?

python json

6
推荐指数
2
解决办法
4454
查看次数

json.encoder.FLOAT_REPR 改变但没有效果

我试图让我的 JSON 编码器转储浮点数只有 2 个十进制精度。所以'2.241'变成'2.24'

我在Alex Martelli 的这个答案中读到,您可以覆盖 json.encoder 的默认 FLOAT_REPR。我尝试了以下方法:

>>> import json
>>> json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')
Run Code Online (Sandbox Code Playgroud)

但我没有得到相同的结果:

>>> json.dumps(2.241)
'2.241'
Run Code Online (Sandbox Code Playgroud)

我什至可以验证 FLOAT_REPR 是否已更改:

>>> print json.encoder.FLOAT_REPR
<function <lambda> at 0xb....>
Run Code Online (Sandbox Code Playgroud)

并按预期工作:

>>> json.encoder.FLOAT_REPR(2.241)
2.24
Run Code Online (Sandbox Code Playgroud)

为什么内置 JSON 模块不使用 FLOAT_REPR 当我看到它已被覆盖并且解决方案应该根据 Alex Martelli 工作?

我已经在两台不同的计算机上对此进行了测试,它们都在 Ubuntu 14.0.4 上运行 Python 2.7.6。

python precision limit

6
推荐指数
1
解决办法
2483
查看次数

如何设置JSONEncoder生成的浮点数?

我正在尝试设置python json库以保存为包含其他词典元素的字典.有许多浮点数,我想限制位数,例如7.

根据SO中的其他帖子,encoder.FLOAT_REPR如果它不起作用将被使用.

例如,以下在Python3.7.1中运行的代码打印所有数字:

import json
json.encoder.FLOAT_REPR = lambda o: format(o, '.7f' )
d = dict()
d['val'] = 5.78686876876089075543
d['name'] = 'kjbkjbkj'
f = open('test.json', 'w')
json.dump(d, f, indent=4)
f.close()
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

它可能无关紧要,但我在OSX上.

编辑

这个问题被标记为重复.然而,在原始的接受(并且直到现在唯一)答案中,明确说明:

注意:此解决方案不适用于python 3.6+

所以解决方案不合适.此外,它使用的是库simplejson 而不是json.

python floating-point json python-3.x

6
推荐指数
2
解决办法
554
查看次数