No documento padrão JSON , conforme vinculado em json.org :
JSON é independente da semântica dos números. Em qualquer linguagem de programação, pode haver vários tipos de números de várias capacidades e complementos, fixos ou flutuantes, binários ou decimais. Isso pode dificultar o intercâmbio entre diferentes linguagens de programação. Em vez disso, o JSON oferece apenas a representação dos números que os humanos usam: uma sequência de dígitos. Todas as linguagens de programação sabem como entender seqüências de dígitos, mesmo que discordem das representações internas. Isso é suficiente para permitir o intercâmbio.
Portanto, é realmente preciso representar decimais como números (em vez de cadeias) em JSON. Abaixo está uma possível solução para o problema.
Defina um codificador JSON customizado:
import json
class CustomJsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return float(obj)
return super(CustomJsonEncoder, self).default(obj)
Em seguida, use-o ao serializar seus dados:
json.dumps(data, cls=CustomJsonEncoder)
Conforme observado nos comentários sobre as outras respostas, as versões mais antigas do python podem atrapalhar a representação ao converter para float, mas esse não é mais o caso.
Para recuperar o decimal em Python:
Decimal(str(value))
Esta solução é sugerida na documentação do Python 3.0 em decimais :
Para criar um decimal de um flutuador, primeiro converta-o em uma string.