복붙노트

[PYTHON] Python에서 JSON으로 직렬화가 10 진수에서 실패합니다 [duplicate]

PYTHON

Python에서 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. ==============================

    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. ==============================

    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. ==============================

    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)
    
  4. from https://stackoverflow.com/questions/16957275/python-to-json-serialization-fails-on-decimal by cc-by-sa and MIT license