35

いくつかの小数を含む python オブジェクトがあります。これにより、json.dumps() が壊れます。

SO から次のソリューションを取得しました (たとえば、Python JSON serialize a Decimal object ) が、推奨されるソリューションはまだ機能しません。Python ウェブサイト - まったく同じ答えがあります。

これを機能させる方法はありますか?

ありがとう。以下は私のコードです。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>
4

3 に答える 3

22

すぐに使用できる Decimal の逆シリアル化をサポートする simplejson の使用について、ここで誰も話さなかったとは信じられません。

import simplejson
from decimal import Decimal

simplejson.dumps({"salary": Decimal("5000000.00")})
'{"salary": 5000000.00}'

simplejson.dumps({"salary": Decimal("1.1")+Decimal("2.2")-Decimal("3.3")})
'{"salary": 0.0}'
于 2015-09-16T16:49:07.663 に答える
21

Django を使用している場合。Decimal および date フィールド用の優れたクラスがあります。

https://docs.djangoproject.com/en/1.10/topics/serialization/#djangojsonencoder

使用するには:

import json
from django.core.serializers.json import DjangoJSONEncoder

json.dumps(value, cls=DjangoJSONEncoder)
于 2016-09-27T05:32:10.430 に答える