我从一个十进制值的数据库中抽取一笔数额。 我试图使用该值在JSON结果Decimal to JSON
json.dumps({ 'sum': amount }) #where amount is my Decimal
的Django无法序列的Decimal
。 我可以将其转换为字符串,但我想在JSON中的数字类型。 如果我尝试将其转换为float
,我最终得到2位小数。
如果可能的话,需要发生什么以获得如下结果?
{ 'sum': 500.50 }
我从一个十进制值的数据库中抽取一笔数额。 我试图使用该值在JSON结果Decimal to JSON
json.dumps({ 'sum': amount }) #where amount is my Decimal
的Django无法序列的Decimal
。 我可以将其转换为字符串,但我想在JSON中的数字类型。 如果我尝试将其转换为float
,我最终得到2位小数。
如果可能的话,需要发生什么以获得如下结果?
{ 'sum': 500.50 }
你可以做的是延长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)
...
这就是如何做一个非工作示例它,希望你有一个很好的起点。
谢谢,我喜欢这个解决方案迄今为止最好的:) – Justin 2010-10-26 03:53:58
其实Django提供了一个内置的类正是这个 - 'django.core.serializers.json.DjangoJSONEncoder ' - 你可以直接使用'simplejson.dumps(mydict,class = DjangoJSONEncoder)'。它还处理日期时间。 – 2010-10-26 08:08:55
@Daniel谢谢。 'class = DjangoJSONEncoder'需要'cls = DjangoJSONEncoder'。这是行得通的,但它给了我一个字符串值:( – Justin 2010-10-26 14:58:54
来自此链接:http://code.google.com/p/simplejson/issues/detail?id=34。
我可以告诉你树认为:
使用cjson它做工精细用十进制值。
利用猴子补丁就像从这个链接的例子:http://code.google.com/p/simplejson/issues/detail?id=61
使用jsonutil看到最后的评论:http://code.google.com/p/simplejson/issues/detail?id=34#c28
你可以在第一个环节发现更多的细节。
JavaScript中没有这样的小数类型,也是python中的标准类型。它是一个数据库特定类型,不属于JSON。采取浮点运算或进行整数运算。
是的,我知道JavaScript中没有匹配类型,我的价值永远不会那么大。我只是希望他们以常规的货币格式“5.95”下来,但不是字符串格式。 – Justin 2010-10-26 03:45:47
小数可以转换为其中的JavaScript知道如何处理
json.dumps({ 'sum': float(amount) })
在我的问题中,我注意到我不想传递一个浮点数,因为他们有很多小数位。 – Justin 2010-10-28 05:14:32
我不知道很多关于Django的一个浮动,但是如果你需要保留两位小数始终,它是不可能做什么你希望你可以乘以100并作为一个整数使用它。 – cambraca 2010-10-26 00:31:33
JSON仅被定义为具有数字的双精度浮点数。它是什么让你把你的数字保持为小数? – Gabe 2010-10-26 00:41:31
我不需要我的数字是十进制的,他们永远不会那么大。这正是我从DB获得的价值,因为它们是货币价值。我对使用int * 100并不感到兴奋,并且浮点数给我两个以上的小数位。我只是希望有一个更优雅的解决方案... – Justin 2010-10-26 03:48:52