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 固有のタイプをチェックする代わりに、より一般的な目的のテストを行うことができます: is is "like" a list? 次に、リストとしてシリアル化します。(ダックタイピング、Python: check if an object is list or tuple (but not string) を参照)。

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、およびリスト自体をリストとして扱います! ただし、string や int などは対象外です。

于 2013-06-14T15:14:34.323 に答える