gpt4 book ai didi

Python 3.5 JSON 序列化 Decimal 对象

转载 作者:行者123 更新时间:2023-11-28 18:11:09 25 4
gpt4 key购买 nike

我需要将十进制值编码到 json 中:999999.99990000005 同时不丢失精度并且不将表示更改为字符串。期望 { "prc": 999999.99990000005 }

从 [这篇文章][1] 我有这段代码。

import json
import decimal

class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)

y = { 'prc' : decimal.Decimal('999999.99990000005')}

但它产生一个字符串

json.dumps(y, cls=DecimalEncoder)

'{"cPrc": "999999.99990000005"}'

str(o) 替换为 isinstance 中的 float(o) 会截断数字。有什么方法可以获得非字符串结果?附言我不能使用任何外部模块,如 simplejson。

编辑:如果我将该值保留为字符串,则以下也会生成一个字符串。

>>> x = json.loads("""{ "cPrc" : "999999.99990000005" }""", parse_float=decimal.Decimal)
>>> x
{'cPrc': '999999.99990000005'}

最佳答案

它不是最漂亮的,但如果您坚持使用 json,我们可以创建一个自定义解码器,并让我们的编码器在处理十进制数据时指定类型。

class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return {
"_type": "decimal",
"value": str(obj)
}
return super(DecimalEncoder, self).default(obj)

上面的代码将小数类型添加为解码器的标志,并将小数编码为字符串以保持精度。

class DecimalDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

def object_hook(self, obj):
if '_type' not in obj:
return obj
type = obj['_type']
if type == 'decimal':
return decimal.Decimal(obj['value'])
return obj

解码器检查我们的 decimal 类型标志,如果是,则使用 decimal 构造函数。对于所有其他实例,它使用默认解码

input = { 'prc' : decimal.Decimal('999999.99990000005')}
encoded = json.dumps(input, cls=DecimalEncoder)
decoded = json.loads(encoded, cls=DecimalDecoder)

最终结果应该接受我们的输入,对其进行编码,并将结果解码为十进制对象。

关于Python 3.5 JSON 序列化 Decimal 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50707239/

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