【问题标题】:bytearray is not JSON serializablebytearray 不是 JSON 可序列化的
【发布时间】:2015-01-07 20:33:57
【问题描述】:

我在Python/Djangobytearray(b'') is not JSON serializable 中收到此错误消息。目前,我这样做:

...
from django.core.serializers.json import DjangoJSONEncoder
...

output = json.dumps(data, cls=DjangoJSONEncoder)
return HttpResponse(output)

我导入DjangoJSONEncoder,因为在此之前我遇到了datetime 的问题。这个问题消失了,但现在我遇到了bytearray 类型的另一个问题。所以,我很想知道,无论您使用什么数据类型,是否有一种标准且通用的方式来创建 json 字符串。

【问题讨论】:

  • 不,当然没有。如果没有先验知识模型,您将如何序列化任意数据类型?仅仅因为您作为程序员了解 bytearray 代表什么并不意味着 JSON 编码器会知道。
  • 特别是,对于 bytearray,是否将其序列化为字符串或列表甚至都不是很明显(JSON 没有那么多类型可供选择)。
  • 我检查了数据库中的表,发现这是因为bit类型的字段,它只取0或1个值。所以,在 Python/Django 中不能处理这样一个标准且“简单”的类型是相当奇怪的
  • 这绝对不是 Python 的限制! JSON 是设计的受限类型集(为了互操作性和安全性);不要将其与酸洗之类的一般序列化混淆。
  • @Jacobian:为什么这令人惊讶?仅仅因为存在可能的映射并不意味着它在所有用例中都是正确的映射。映射只有 0 和 1 的字节数组可以映射到布尔值列表、字符串或整数列表,并且所有 3 都可以表示 JSON 中的信息。但是如果这些字节代表字符呢?还是小整数?

标签: python json django serialization


【解决方案1】:

正如@Martijn Pieters 在他的评论中所建议的,Json 编码器不知道如何将字节数组转换为相应的 json 表示法。

查看https://docs.python.org/2/library/json.html#encoders-and-decoders 了解 json 可以理解的数据类型。 DjangoJSONEncoder 使用相同的子集,了解 django 查询集。

您的问题的解决方案可能是为 bytearray 实现 custom encoder,并在 UI 中正确处理响应。

【讨论】:

    【解决方案2】:

    对于json不能编码的类型,可以先使用cPickle.dumps()转成字符串类型再使用json。

    在使用 cPickle 之前,请记住来自 docs 的警告:

    警告:pickle 模块并非旨在防止错误或恶意构造的数据。永远不要取消从不受信任或未经身份验证的来源收到的数据。

    【讨论】:

    • 请允许我引用 pickle 文档顶部的大红框:“警告:pickle 模块并非旨在防止错误或恶意构建的数据。切勿取消从不受信任的数据接收的数据或未经身份验证的来源。”
    • @Yann Vernier。这是很重要的一点。幸运的是,在我的项目中,我将处理一个受信任的数据库
    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 2019-07-05
    • 2016-08-03
    • 1970-01-01
    • 2017-10-24
    • 2016-09-19
    • 2016-08-02
    • 2019-02-08
    相关资源
    最近更新 更多