【问题标题】:Serialize complex python objects with multiple classes and lists to JSON将具有多个类和列表的复杂 python 对象序列化为 JSON
【发布时间】:2017-09-11 19:36:37
【问题描述】:

我正在尝试使用多个嵌套对象和列表来序列化复杂的 python 对象。我遇到的问题描述在这里:Python serialize objects list to JSON

现在,我有一些对象,可以说:

class A:
    id = 0
    objects_b = []
    objects_c = []

class B:
    id = 0

class C:
    id = 0

a = A()
b = B()
c = C()
a.objects_b = [b]
a.objects_c = [c]

我不想向我添加到结构中的每个新类添加自定义方法。有没有办法制作统一的序列化方法来处理每个新类,无论它是如何包含在列表中或作为参数的? 将使用任何对象类型的方法会很棒,但我也可以容忍将我的所有对象从某个通用类型中子类化。试图弄清楚最后一个小时并有点疯狂,我几乎准备好在不使用 json lib 的情况下创建自己的序列化方法,但这似乎太多了......

【问题讨论】:

  • 呃,如果你愿意写你自己的序列化方法而不是使用json,为什么不使用pickle呢?这是标准库的一部分,它应该处理自定义 Python 类型。
  • 无论如何,通常solutions to this problem 将任意 Python 对象序列化为 JSON 涉及的步骤相当于为每种类类型编写自定义方法。因为本质上,JSON 不是为处理任意对象而设计的,而是本质上是两种抽象数据类型,JSON 数组和 JSON 对象。在 Python 中,JSON 用于序列化 dictliststrint 类型字段/值的复杂组合。听起来你不想要 JSON,你想要pickle
  • 你考虑过jsonpickle:pypi.python.org/pypi/jsonpickle吗?
  • @quamrana pickle 和 jsonpickle 有同样的问题。他们只是忽略自定义类型对象的列表
  • 嗯,对我有用。我像你一样创建存根对象,并添加python类型(int、str、list、dict等)和其他存根的混合属性,而jsonpickle有自己的方式在常规json中表示我的存根。

标签: python json list serialization


【解决方案1】:

JSON 只能序列化简单类型(字符串、字典、列表等)。它不知道如何处理 Python 对象。

因此,如果您想序列化对象,则无法自行定义这些对象所属的类的序列化。您可以使用 json 库(阅读 default)来生成对象的序列化,但是您拥有自己的应用程序特定(或至少是 python 特定)的 json 扩展,您不妨使用一些真正的东西特定于 python 的,例如 pickle,它已经开箱即用。人们使用 json 是因为它简单、易读且与语言无关。如果你定义自己的 json 协议扩展来序列化你的 python 对象,那么一开始就没有任何好的理由使用 json。

编写自己的对象序列化很难。考虑检测周期,为可能恰好存在于对象图中的每个对象编写序列化程序(即使它只是像 python DateTime 这样简单的东西)等等。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多