首页 > 解决方案 > Python 复合类 JSON 序列化

问题描述

我有我称之为复合类的东西

因此,LegoSet 类是由 LegoSetVariant 类的实例构造而成,而 LegoSetVariant 类又是由许多不同的类实例构造而成。

这很好,我可以成功地初始化类。但是,然后我想将类对象序列化为 JSON。这被证明有点棘手,因为复合类错误为不可序列化。

class LegoSet:
    def __init__(
        self,
        typename,
        id,
        productCode,
        name,
        slug,
        primaryImage,
        baseImgUrl,
        overrideUrl,
        variant,
    ):
        self.__typename = typename
        self.__id = id
        self.__productCode = productCode
        self.__name = name
        self.__slug = slug
        self.__primaryImage = primaryImage
        self.__baseImgUrl = baseImgUrl
        self.__overrideUrl = overrideUrl
        self.__variant = variant


class LegoSetVariant:
    def __init__(self, id, sku, salePercentage, attributes, price, listPrice):
        self.__id = id
        self.__sku = sku
        self.__salePercentage = salePercentage
        self.__atributes = attributes
        self.__price = price
        self.__listPrice = listPrice


class LegoSetVariantAttributes:
    def __init__(
        self,
        rating,
        maxOrderQuantity,
        availabilityStatus,
        availabilityText,
        vipAvailabilityStatus,
        vipAvailabilityText,
        canAddToBag,
        canAddToWishlist,
        vipCanAddToBag,
        onSale,
        isNew,
        featuredFlags,
    ):
        self.__rating = rating
        self.__maxOrderQuantity = maxOrderQuantity
        self.__availabilityStatus = availabilityStatus
        self.__availabilityText = availabilityText
        self.__vipAvailabilityStatus = vipAvailabilityStatus
        self.__vipAvailabilityText = vipAvailabilityText
        self.__canAddToBag = canAddToBag
        self.__canAddToWishlist = canAddToWishlist
        self.__vipCanAddToBag = vipCanAddToBag
        self.__onSale = onSale
        self.__isNew = isNew
        self.__featuredFlags = featuredFlags


class LegoSetVariantAttributesFeaturedFlags:
    def __init__(self, key, label):
        self.__key = key
        self.__label = label


class LegoSetVariantPrice:
    def __init__(self, formattedAmount, centAmount, currencyCode, formattedValue):
        self.__formattedAmount = formattedAmount
        self.__centAmount = centAmount
        self.__currencyCode = currencyCode
        self.__formattedValue = formattedValue


class LegoSetVariantListPrice:
    def __init__(self, formattedAmount, centAmount):
        self.__formattedAmount = formattedAmount
        self.__centAmount = centAmount

标签: pythonjsonserialization

解决方案


试试这个:

def unpack_into_dict(object):
    res = {}
    for key, val in object.__dict__.items():
        if hasattr(val, '__dict__'):
            res[key] = unpack_into_dict(val)
        else:
            res[key] = val
    return res

推荐阅读