超出范围的浮点值不符合 Django 渲染的 JSON

Posted

技术标签:

【中文标题】超出范围的浮点值不符合 Django 渲染的 JSON【英文标题】:Out of range float values are not JSON compliant with django render 【发布时间】:2020-10-30 01:04:07 【问题描述】:

我正在使用 django-restframework 并正在使用 JSONRenderer 来呈现我的返回响应。

但我总是遇到如下错误:

    response = response.render()
  File "C:\Users\Domob\Desktop\dev\venv_bv_crm\lib\site-packages\django\template\response.py", line 106, in render
    self.content = self.rendered_content
  File "C:\Users\Domob\Desktop\dev\venv_bv_crm\lib\site-packages\rest_framework\response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "C:\Users\Domob\Desktop\dev\venv_bv_crm\lib\site-packages\rest_framework\renderers.py", line 104, in render
    allow_nan=not self.strict, separators=separators
  File "C:\Users\Domob\Desktop\dev\venv_bv_crm\lib\site-packages\rest_framework\utils\json.py", line 25, in dumps
    return json.dumps(*args, **kwargs)
  File "D:\python3\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "D:\python3\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "D:\python3\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)

ValueError: Out of range float values are not JSON compliant

我的主要逻辑代码如下,我的数据字典中有一些nan 值:


class BasicView(viewsets.ModelViewSet):
    queryset = ...
    serializer_class = ...
    filter_backends = ...
    renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
  

   @action(methods=['get'], url_path='dash', detail=False)
    def dashboard(self, request):
        try:
            data = a = ["k": 1, "v": float('nan'), "k": 2, "v": float('inf')]
            return Response("data":data)

        except json.decoder.JSONDecodeError:
            print(f"empty result with request.user.id")
            return Response(status=status.HTTP_404_NOT_FOUND)

        except:
            import traceback as tb
            print(tb.format_exc())
            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)


我怎样才能得到正确的回应?

【问题讨论】:

【参考方案1】:

JSON没有NaN的概念,它只能表示代表实际数字的数字。 (它也没有其他一些浮点数概念,如无穷大和负零。)

您必须确保序列化为 JSON 的数据中没有 NaN 浮点数。

【讨论】:

嗨,我也遇到了同样的错误,有没有其他解决方案,比如允许 Nan? @AvinMathew 你可以在使用json.loads时传输所有这些NaNInfinity,-Infinity @AvinMathew 我的意思是 json.loads(parse_constant=your_own_method)

以上是关于超出范围的浮点值不符合 Django 渲染的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中符合 RandomAccessCollection 时,下标中的索引超出范围

Django -> queryset[index] 索引超出范围

sql server中单引号拼接字符串(书写错误会出现错误"浮点值 XXXX 超出了计算机表示范围(8 个字节)。“XX”附近有语法错误。")

键盘输入小于10的正整数n,若输入超出范围,则重新输入,直到符合,计算并输出n!

为啥我收到错误 1264:第 1 行的“ping”列的值超出范围?

索引超出范围的 SwiftUI 问题