【问题标题】:json.dumps not working with custom python objectjson.dumps 不适用于自定义 python 对象
【发布时间】:2021-12-23 14:10:38
【问题描述】:

我无法在 python 3 中序列化自定义对象。 下面是解释和代码

packages= []
data = {
    "simplefield": "value1",
    "complexfield": packages,
}

其中 packages 是 custom object Library 的列表。 Library object 是一个如下的类(我也对json.JSONEncoder 进行了子分类,但它没有帮助)

class Library(json.JSONEncoder):
def __init__(self, name):
    print("calling Library constructor ")
    self.name = name

def default(self, object):
    print("calling default method ")
    if isinstance(object, Library):
        return {
            "name": object.name
        }
    else:
        raiseExceptions("Object is not instance of Library")

现在我正在调用json.dumps(data),但它正在抛出异常。

TypeError: Object of type `Library` is not JSON serializable 

好像"calling default method"没有打印的意思,Library.default方法没有被调用

有人可以帮忙吗?

我也提到了Serializing class instance to JSON,但它没有多大帮助

【问题讨论】:

  • 你的输入和输出是什么?
  • 它应该序列化库对象。它的实现在默认方法中给出

标签: json python-3.x


【解决方案1】:

继承json.JSONEncoder 不会使类可序列化。您应该单独定义您的编码器,然后在json.dumps 调用中提供编码器实例。

查看下面的示例方法

import json
from typing import Any


class Library:
    def __init__(self, name):
        print("calling Library constructor ")
        self.name = name

    def __repr__(self):
        # I have just created a serialized version of the object
        return '{"name": "%s"}' % self.name

# Create your custom encoder
class CustomEncoder(json.JSONEncoder):

    def default(self, o: Any) -> Any:
        # Encode differently for different types
        return str(o) if isinstance(o, Library) else super().default(o)


packages = [Library("package1"), Library("package2")]
data = {
    "simplefield": "value1",
    "complexfield": packages,
}
#Use your encoder while serializing
print(json.dumps(data, cls=CustomEncoder))

输出是这样的:

{"simplefield": "value1", "complexfield": ["{\"name\": \"package1\"}", "{\"name\": \"package2\"}"]}

【讨论】:

  • 嗨克里斯,如何删除这个:双引号“”和转义字符 \ 在复杂字段中?
【解决方案2】:

可以使用json.dumpdefault参数:

def default(obj):
  if isinstance(obj, Library):
      return {"name": obj.name}
  raise TypeError(f"Can't serialize {obj!r}.")

json.dumps(data, default=default)

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2020-03-13
    相关资源
    最近更新 更多