반응형
Python에서 JSON으로 일련화가 10진수로 실패함
소수점을 포함하는 python 객체를 가지고 있습니다.이로 인해 json.dumps()가 파손됩니다.
SO에서 다음 솔루션(예: Python JSON이 Decimal 개체를 직렬화함)을 얻었지만, 반동 솔루션은 여전히 작동하지 않습니다.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>
서브클래스를 만드는 것은 권장되지 않습니다.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에서만 작동하며 이후 버전에서 더 이상 호출되지 않는 개인 메서드보다 우선합니다.
여기서 아무도 Simplejson을 사용하는 것에 대해 언급하지 않았다니 믿을 수 없습니다.이것은 Decimal의 디시리얼라이제이션(deserialize)을 지원하는 것입니다.
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}'
장고를 쓰고 있다면.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)
언급URL : https://stackoverflow.com/questions/16957275/python-to-json-serialization-fails-on-decimal
반응형
'code' 카테고리의 다른 글
"Unparseable date: 13028677828"이 서버로부터 받은 밀리초 형식의 날짜를 Gson으로 역직렬화하려고 합니다. (0) | 2023.02.08 |
---|---|
Word Press:add_filter를 사용할 때 값을 반환하는 방법 (0) | 2023.02.08 |
각도 UI 라우터: 상태에 대한 액세스를 방지하는 방법 (0) | 2023.02.08 |
뷰가 열리거나 표시될 때마다 컨트롤러 기능 실행 (0) | 2023.02.08 |
일부 알려진 필드 이름과 일부 알려지지 않은 필드 이름을 가진 JSON의 마셜 해제 (0) | 2023.02.08 |