[PYTHON] Python에서 JSON으로 직렬화가 10 진수에서 실패합니다 [duplicate]
PYTHONPython에서 JSON으로 직렬화가 10 진수에서 실패합니다 [duplicate]
몇 가지 소수를 포함하는 파이썬 개체가 있습니다. 이로 인해 json.dumps ()가 중단됩니다.
SO에서 다음 해결책을 얻었습니다 (예 : Python JSON은 Decimal 객체를 serialize합니다). recoomended 솔루션은 여전히 작동하지 않습니다. 파이썬 웹 사이트 - 똑같은 답을 가지고 있습니다.
이 작품을 만드는 방법에 대한 제안이 있으십니까?
감사. 아래는 제 코드입니다. 덤프 ()가 특수 엔코더에 들어 가지 않은 것 같습니다.
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.하위 클래스를 만드는 것이 더 이상 권장되지 않습니다. json.dump () 및 json.dumps () 함수는 기본 함수를 사용합니다.
하위 클래스를 만드는 것이 더 이상 권장되지 않습니다. json.dump () 및 json.dumps () 함수는 기본 함수를 사용합니다.
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에서만 작동하며 이후 버전에서는 더 이상 호출되지 않는 개인 메서드를 재정의합니다.
-
==============================
2.십진법의 탈 직렬화를 지원하는 simplejson의 사용에 관해서는 여기서 아무도 이야기하지 않는다고 나는 믿을 수 없다.
십진법의 탈 직렬화를 지원하는 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}'
-
==============================
3.당신이 장고를 사용한다면. 10 진수 및 날짜 필드에는 훌륭한 클래스가 있습니다.
당신이 장고를 사용한다면. 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)
from https://stackoverflow.com/questions/16957275/python-to-json-serialization-fails-on-decimal by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] json.dumps (np.arange (5) .tolist ())가 작동하는 동안 json.dumps (list (np.arange (5)))가 실패하는 이유는 무엇입니까? (0) | 2018.11.12 |
---|---|
[PYTHON] 파이썬에서 비트 필드 조작을 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2018.11.12 |
[PYTHON] 파이썬 : 패키지의 '전용'모듈 (0) | 2018.11.12 |
[PYTHON] 압축 및 가변 길이 배열 / 파이썬에서 struct 모듈을 사용하여 문자열 (0) | 2018.11.12 |
[PYTHON] Pythonic Circular List (0) | 2018.11.12 |