3

我用 . 序列化 SQLAlchemy 映射的对象json.dumps。而且我希望我的对象的关联代理属性也能正确序列化。默认情况下它们没有正确序列化,所以我必须编写一个特定的 JSON 编码器:

from sqlalchemy.ext.associationproxy import _AssociationList
class MyEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, _AssociationList):
            return list(obj)
        return JSONEncoder.default(self, obj)

这看起来不太好,因为我需要导入_AssociationListSQLAlchemy 私有的。

还有其他选择吗?

4

1 回答 1

1

您可以进行更通用的测试,而不是检查 _AssociationList 特定类型:“喜欢”是一个列表吗?然后将其序列化为列表!(鸭子打字,请参阅Python:检查对象是列表还是元组(但不是字符串))。

def is_sequence(arg):
    return (not hasattr(arg, "strip") and
        hasattr(arg, "__getitem__") or
        hasattr(arg, "__iter__"))

class MyEncoder(JSONEncoder):
    def default(self, obj):
        if is_sequence(obj):
            return list(obj)
        return JSONEncoder.default(self, obj)

这会将集合、元组、_AssociationLists 和列表本身视为列表!但不是字符串、整数等。

于 2013-06-14T15:14:34.323 回答