如何将嵌套的 类 转换为 json 或字典?

How to convert nested classes to json or dict?

我有 class 个 class 如下:


class Base:
  def __init__(self):
    self.var1 = “variable”

class Child:
  def __init__(self):
    self.base = Base()
    self.var2 = False

class RootChild:
  def __init__(self):
    self.child = Child()
    self.var3 = “variable”
    self.base = Base()

我想保存一个“RootChild”的实例,它的所有字段都在 json 中表示。关于这个任务有很多主题,但我无法理解它们的区别和用例。这个问题的大多数 pythonic 解决方案是什么?

你的里程会有所不同 - 从使用“序列化器”策略:一层机制知道如何从你的 classes 映射到 Json 并返回, 这可能需要大量工作(达到 hand-describing 每个字段应该 serialized/unserialized 的程度)- https://docs.pylonsproject.org/projects/colander/en/latest/

或者你可以构建一个自定义的 JSON 编码器,它只会检查它是否是一个已知的 class 然后 return 一个包含所有字段的字典(可以自动提取)通过自省)-(检查示例以在此处扩展编码器:https://docs.python.org/3/library/json.html

无论如何,有很多 trade-offs 和不同级别的工作 - 如果您打算在具有相同 class 的 Python 应用程序中重新阅读 JSON,您可以使用“jsonpickle”——它会向您的 [= 添加额外的 meta-data 32=],但将确保所有对象的往返完全按照它们的原样:https://jsonpickle.github.io/

在不使用任何其他库的情况下,假设您只需要导出 classes,自定义编码器策略可能会有些简单:

import json
class SimpleObject(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, "__dict__"):
            return {key:value for key, value in obj.__dict__.items() if not key.startswith("_")}
        return super().default(obj)
a = RootChild()

关于交互环境:

In [52]: a = RootChild()
In [53]: print(json.dumps(a, cls=SimpleObject, indent=4))
{
    "child": {
        "base": {
            "var1": "variable"
        },
        "var2": false
    },
    "var3": "variable",
    "base": {
        "var1": "variable"
    }
}