【问题标题】:Python, serialize an actual object from a class into jsonPython,将类中的实际对象序列化为json
【发布时间】:2021-06-24 14:39:31
【问题描述】:

我有一个带有子类的类。我可以使用 jsonpickle 库将其序列化为 JSON。我试图更好地理解一些东西。当我尝试使用 Python 的原生 json 库时,它说该对象不可序列化。

我正在看这个指南:https://www.programiz.com/python-programming/json

他正在展示一个这样定义的类:

person_dict = {"name": "Bob",
"languages": ["English", "Fench"],
"married": True,
"age": 32
}

序列化OK。

print(json.dumps(person_dict))
# outputs "{"name": "Bob", "languages": ["English", "Fench"], "married": true, "age": 32}"

但我正在创建一个类并从中实例化一个对象。

class Purchase(object):
    def __init__(self, receipt_id, order_id):
        self.receipt_id = receipt_id
        self.order_id = order_id
        self.items = []

test = Purchase("123", "abc")
test.items.append("item1")
test.items.append("item2")

但是 json.dumps() 在这里不起作用。

print(json.dumps(test))
# outputs "TypeError: Object of type Purchase is not JSON serializable"

我在这里缺少什么基础知识?

【问题讨论】:

  • 示例是字典,不是类。

标签: python json serialization


【解决方案1】:

在你的对象中,添加一个在json中序列化的方法:

def serialize(self):
    """JSON serializer for objects not serializable by default json code"""

    return json.dumps({'items': self.items, 'receipt_id': self.receipt_id, 'order_id': self.order_id})

并使用默认参数调用 json.dumps:

json.dumps(test, default=Purchase.serialize)

参考:https://docs.python.org/3/library/json.html#json.dumps

如果指定,默认应该是一个被调用的函数 否则无法序列化的对象。它应该返回一个 JSON 对象的可编码版本或引发 TypeError。如果不 指定,引发 TypeError。

>>> json.dumps(test, default=Purchase.serialize)
'"{\\"items\\": [\\"item1\\", \\"item2\\"], \\"receipt_id\\": \\"123\\", \\"order_id\\": \\"abc\\"}"'
>>> d = json.loads('"{\\"items\\": [\\"item1\\", \\"item2\\"], \\"receipt_id\\": \\"123\\", \\"order_id\\": \\"abc\\"}"')
>>> d
'{"items": ["item1", "item2"], "receipt_id": "123", "order_id": "abc"}'

【讨论】:

猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 2022-11-16
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2016-12-08
  • 2017-03-05
相关资源
最近更新 更多