2010-10-26 53 views
7

我从一个十进制值的数据库中抽取一笔数额。 我试图使用该值在JSON结果Decimal to JSON

json.dumps({ 'sum': amount }) #where amount is my Decimal 

的Django无法序列的Decimal。 我可以将其转换为字符串,但我想在JSON中的数字类型。 如果我尝试将其转换为float,我最终得到2位小数。

如果可能的话,需要发生什么以获得如下结果?

{ 'sum': 500.50 } 
+0

我不知道很多关于Django的一个浮动,但是如果你需要保留两位小数始终,它是不可能做什么你希望你可以乘以100并作为一个整数使用它。 – cambraca 2010-10-26 00:31:33

+1

JSON仅被定义为具有数字的双精度浮点数。它是什么让你把你的数字保持为小数? – Gabe 2010-10-26 00:41:31

+0

我不需要我的数字是十进制的,他们永远不会那么大。这正是我从DB获得的价值,因为它们是货币价值。我对使用int * 100并不感到兴奋,并且浮点数给我两个以上的小数位。我只是希望有一个更优雅的解决方案... – Justin 2010-10-26 03:48:52

回答

11

你可以做的是延长JSONDecoder类提供了十进制类型的自定义序列化,类似于本文档中的例子:http://docs.python.org/py3k/library/json.html

>>> import json 
>>> class DecimalEncoder(json.JSONEncoder): 
...  def default(self, obj): 
...   if isinstance(obj, Decimal): 
...    return "%.2f" % obj 
...   return json.JSONEncoder.default(self, obj) 
... 

这就是如何做一个非工作示例它,希望你有一个很好的起点。

+0

谢谢,我喜欢这个解决方案迄今为止最好的:) – Justin 2010-10-26 03:53:58

+10

其实Django提供了一个内置的类正是这个 - 'django.core.serializers.json.DjangoJSONEncoder ' - 你可以直接使用'simplejson.dumps(mydict,class = DjangoJSONEncoder)'。它还处理日期时间。 – 2010-10-26 08:08:55

+3

@Daniel谢谢。 'class = DjangoJSONEncoder'需要'cls = DjangoJSONEncoder'。这是行得通的,但它给了我一个字符串值:( – Justin 2010-10-26 14:58:54

0

JavaScript中没有这样的小数类型,也是python中的标准类型。它是一个数据库特定类型,不属于JSON。采取浮点运算或进行整数运算。

+0

是的,我知道JavaScript中没有匹配类型,我的价值永远不会那么大。我只是希望他们以常规的货币格式“5.95”下来,但不是字符串格式。 – Justin 2010-10-26 03:45:47

0

小数可以转换为其中的JavaScript知道如何处理

json.dumps({ 'sum': float(amount) }) 
+0

在我的问题中,我注意到我不想传递一个浮点数,因为他们有很多小数位。 – Justin 2010-10-28 05:14:32