繁体   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