簡體   English   中英

如何序列化包含類實例的列表?

[英]How to serialize a list containing class instances?

如何將包含對象列表的對象序列化為 JSON?

我得到的錯誤:

TypeError: Object of type person is not JSON serializable

代碼:

import json

class person:
    def __init__(self, name, cars):
        self._name = name
        self._cars = cars
    
class car:
    def __init__(self, brand, color):
        self._brand = brand
        self._color = color

Jason = person("Jason", [car("Toyota", "Blue"), car("Honda", "Red")])
Kenny = person("Kenny", [car("Honda", "Black"), car("Toyota", "Pink")])

json = json.dumps([Jason, Kenny])
print(json)

我想要的輸出:

[
    {
        "name": "Jason",
        "cars":[
            {
                "brand": "Toyota",
                "color": "Blue"
            },
            {
                "brand": "Honda",
                "color": "Red"
            }
        ]
    },
    {
       ...
    }
]

您可以創建自己的json.JSONEncoder並向您的類添加特殊方法。 例如:

import json


class MyEncoder(json.JSONEncoder):
    def default(self, o):
        if hasattr(o, "reprJson"):
            return o.reprJson()
        else:
            return super().default(o)


class person:
    def __init__(self, name, cars):
        self._name = name
        self._cars = cars

    def reprJson(self):
        return dict(name=self._name, cars=self._cars)


class car:
    def __init__(self, brand, color):
        self._brand = brand
        self._color = color

    def reprJson(self):
        return dict(brand=self._brand, color=self._color)


Jason = person("Jason", [car("Toyota", "Blue"), car("Honda", "Red")])
Kenny = person("Kenny", [car("Honda", "Black"), car("Toyota", "Pink")])

print(json.dumps([Jason, Kenny], cls=MyEncoder, indent=4))

印刷:

[
    {
        "name": "Jason",
        "cars": [
            {
                "brand": "Toyota",
                "color": "Blue"
            },
            {
                "brand": "Honda",
                "color": "Red"
            }
        ]
    },
    {
        "name": "Kenny",
        "cars": [
            {
                "brand": "Honda",
                "color": "Black"
            },
            {
                "brand": "Toyota",
                "color": "Pink"
            }
        ]
    }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM