当前位置: 首页 > 知识库问答 >
问题:

Python到JSON序列化在十进制失败[重复]

柴嘉年
2023-03-14

谢了。下面是我的代码。看起来dumps()甚至没有进入专用编码器。

clayton@mserver:~/python> cat test1.py
import json, decimal

class DecimalEncoder(json.JSONEncoder):
        def _iterencode(self, o, markers=None):
                print "here we go o is a == ", type(o)
                if isinstance(o, decimal.Decimal):
                        print "woohoo! got a decimal"
                        return (str(o) for o in [o])
                return super(DecimalEncoder, self)._iterencode(o, markers)

z = json.dumps( {'x': decimal.Decimal('5.5')}, cls=DecimalEncoder )
print z
clayton@mserver:~/python> python test1.py
Traceback (most recent call last):
  File "test1.py", line 11, in <module>
    z = json.dumps( {'x': decimal.Decimal('5.5')}, cls=DecimalEncoder )
  File "/home/clayton/python/Python-2.7.3/lib/python2.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/home/clayton/python/Python-2.7.3/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/home/clayton/python/Python-2.7.3/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/home/clayton/python/Python-2.7.3/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('5.5') is not JSON serializable
clayton@mserver:~/python>

共有1个答案

寿毅庵
2023-03-14

它不(不再)建议您创建子类;json.dump()json.dumps()函数采用default函数

def decimal_default(obj):
    if isinstance(obj, decimal.Decimal):
        return float(obj)
    raise TypeError

json.dumps({'x': decimal.Decimal('5.5')}, default=decimal_default)

演示:

>>> def decimal_default(obj):
...     if isinstance(obj, decimal.Decimal):
...         return float(obj)
...     raise TypeError
... 
>>> json.dumps({'x': decimal.Decimal('5.5')}, default=decimal_default)
'{"x": 5.5}'

您找到的代码只在Python 2.6上工作,并且重写了一个在以后的版本中不再调用的私有方法。

 类似资料:
  • 问题内容: 我有一个包含一些小数的python对象。这导致json.dumps()中断。 我从SO获得了以下解决方案(例如PythonJSON序列化Decimal对象),但是重新组合的解决方案仍然无法正常工作。Python网站-具有完全相同的答案。 有什么建议可以使这项工作吗? 谢谢。下面是我的代码。看起来dumps()甚至都没有进入专门的编码器。 问题答案: 不(不再)建议您创建一个子类。的和函

  • 所以我有一个带有一些字段的对象。。。 将其序列化为JSON,如下所示: 稍后,当我需要读取这个json文件时,我尝试这样做: 我得到的错误是: 文件中的JSON是大意如下的东西: 当它试图导入主机的ArrayList时,它似乎会窒息,但它能够毫无问题地将它们写出来。 有谁能给我一些建议,让我的导入工作没有问题吗?

  • 本文向大家介绍Python中的十进制到二进制列表转换,包括了Python中的十进制到二进制列表转换的使用技巧和注意事项,需要的朋友参考一下 Python是一种通用语言,可以处理数据处理过程中提出的许多要求。当我们需要将十进制数转换为二进制数时,可以使用以下python程序。 使用格式 我们可以使用格式化程序中的字母来表示哪个数字基:十进制,十六进制,八进制或二进制,我们希望对数字进行格式化。在下面

  • 两周以来,我一直在努力和阅读来解决这个问题,但我尝试的一切都没有奏效:-( 我正在使用python 2.7。 据我所知,我确实有一个base64字符串,格式如下: 我想把它转换成十六进制字符串。00000000194BD636AEDEAE4C9827C9465288D7F40700BA89A9BA12E1314B81606DB385F3B7B100000074656E0000BA89A9BA12E

  • 问题内容: 我有一些二进制数据,它们在Python中是字节字符串数组的形式。 是否有一种可移植的方式来序列化其他语言可以读取的数据? JSON丢失了,因为我刚刚发现它没有存储二进制数据的真正方法。其字符串应为Unicode。 我不想使用,因为我不想存在安全风险,因此将其限制在其他Python程序中使用。 有什么建议吗?我真的很想使用内置库(或至少是标准Anaconda发行版中的一个库)。 问题答案

  • 我想做一个java程序,用户输入一个十进制数,然后它转换成二进制。这是我到目前为止所拥有的,但是当我输入8时,虽然循环只循环一次,只给我0。我知道二进制中的8是1000,所以我不明白我做错了什么。我需要代码变得简单。请帮忙谢谢