json - 如何将嵌套类转换为 json 或 dict?

标签 json python-3.x dictionary object python-3.10

我的类(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 表示。关于此任务有很多主题,但我无法理解它们的差异和用例。这个问题的大多数 Python 解决方案是什么?

最佳答案

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

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

无论如何,都会有很多权衡和不同级别的工作 - 如果您打算在具有相同类的Python应用程序中读回JSON,您可以使用“jsonpickle” - 它将向您的JSON添加额外的元数据,但将确保所有对象的往返完全按原样:https://jsonpickle.github.io/

不使用任何其他库,并且假设您只需要导出类,自定义编码器策略可能会有些简单:

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"
    }
}

关于json - 如何将嵌套类转换为 json 或 dict?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71266731/

相关文章:

php android spinner - JSONObject 无法转换为 JSONArray

php - 如何将 JSON 从 PHP 传递到 jQuery

C# GroupBy 和 Average 嵌套字典

python - 使用搅拌器创建平铺 map

c++ - 当插入太多元素时,std::map 会自动调整大小吗?

javascript - 使用 JavaScript 对象表示法访问 json 值

javascript - 如何将 JavaScript 对象的属性值提取到数组中?

python - beautifulsoup和bs4有什么区别

python - Python 脚本必须将函数定义为 main 吗?

python-3.x - 使用最少的 Cython 模块(Python3、Anaconda3、Windows7)导致 Python 崩溃