【问题标题】:Decimal to JSON [duplicate]十进制到 JSON [重复]
【发布时间】:2011-04-30 12:14:33
【问题描述】:

我正在从一个十进制值的数据库中提取一个总和。 我正在尝试在 JSON 结果中使用该值

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

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

如果可能,需要做什么才能获得如下结果?

{ 'sum': 500.50 }

【问题讨论】:

  • 我对 django 了解不多,但是如果您总是需要两位小数,并且不可能完全按照您的要求进行操作,您可以乘以 100 并将其作为整数使用。跨度>
  • JSON 仅被定义为具有数字的双精度浮点数。将数字保留为小数有什么好处?
  • 我不需要我的数字是十进制的,它们永远不会那么大。这正是我从数据库中得到的,因为它们是货币价值。我对使用 int * 100 并不感到兴奋,而浮点数给了我两个以上的小数位。我只是希望有一个更优雅的解决方案......

标签: python django


【解决方案1】:

您可以做的是扩展 JSONDecoder 类,为 Decimal 类型提供自定义序列化程序,类似于本文档中的示例: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)
...

这是一个无效的示例,希望对您来说是一个很好的起点。

【讨论】:

  • 谢谢,我最喜欢这个解决方案:)
  • 实际上 Django 为此提供了一个内置类 - django.core.serializers.json.DjangoJSONEncoder - 你可以通过 simplejson.dumps(mydict, class=DjangoJSONEncoder) 直接使用它。它还处理日期时间。
  • @Daniel 谢谢。 'class=DjangoJSONEncoder' 需要是 'cls=DjangoJSONEncoder'。这确实有效,但它给了我一个字符串值:(
  • 呵呵,这给了我一个字符串值,与在 json.dumps 调用中执行 'str(amount)' 相同...我决定将其保留为字符串并处理它在客户端..
  • 你可以随心所欲,只需更改return "%.2f" % obj这一行。
【解决方案2】:

来自此链接:http://code.google.com/p/simplejson/issues/detail?id=34

我可以告诉你树的想法:

您可以在第一个链接中找到更多详细信息。

【讨论】:

    【解决方案3】:

    Javascript 中没有 Decimal 类型,python 中的标准类型也是如此。它是特定于数据库的类型,而不是 JSON 的一部分。取浮点数或进行整数运算。

    【讨论】:

    • 是的,我知道 JavaScript 中没有匹配的类型,我的值永远不会那么大。我只是希望它们以常规货币格式“5.95”而不是字符串格式。
    • JSON 标准独立于 JS。它还将数字定义为带有可选 - 和 的数字序列。解析数字后不讨论内存表示。从 2.4 开始,十进制也是 Python 中的标准,你必须明确地导入它(从十进制导入十进制)。不过它是内置的。
    【解决方案4】:

    十进制可以转换为 javascript 知道如何处理的浮点数

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

    【讨论】:

    • 在我的问题中,我注意到我不想传递浮点数,因为它们有很多小数位。
    猜你喜欢
    • 2013-06-13
    • 2017-09-28
    • 1970-01-01
    • 2012-11-14
    • 2012-10-20
    • 2016-12-27
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多