python 10進数を含むオブジェクトがあります。これにより、json.dumps()が破損します。
SO(例: Python JSONでDecimalオブジェクトをシリアル化する )から次のソリューションを取得しましたが、再構成されたソリューションはまだ機能しません。Python = website-まったく同じ答えがあります。
これを機能させる方法はありますか?
ありがとう。以下は私のコードです。 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>
サブクラスを作成することは(お勧めしません); 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でのみ機能し、以降のバージョンでは呼び出されなくなったプライベートメソッドをオーバーライドします。
ここでは、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}'
Djangoを使用している場合。 10進数フィールドと日付フィールドには素晴らしいクラスがあります。
https://docs.djangoproject.com/en/1.10/topics/serialization/#djangojsonencoder
使用するには:
import json
from Django.core.serializers.json import DjangoJSONEncoder
json.dumps(value, cls=DjangoJSONEncoder)