2

json オブジェクトを使用して通信するプログラムを作成しようとしていますが、カスタム クラスで問題が発生しています。基本的に、json.dumps に渡すオブジェクトは大きなディクショナリで、基本的なクラス (主に文字列、リスト、その他のディクショナリ) を使用するだけですが、場合によっては、文字列をカスタム クラス A のオブジェクトにマップする必要があります。

これらのオブジェクトを使用すると、次のようなメッセージが表示されます。

TypeError: <module.A object at 0x01659110> is not JSON serializable

私がやりたいのは、タイプ A のオブジェクトのデフォルトのエンコーディング メソッドを作成することです。オブジェクトは非常に単純で、ラベル (str 型) といくつかのさまざまな整数を含むだけです。ラベルは A を一意に識別するのに十分なので、json がラベルのみを使用する場合は問題ありません。

多くの同様の問題をオンラインで読んだ後、私は次のようになりました。

class AEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, A):
            return o.label
        else:
            return super(AEncoder, self).default(o)

問題は、私が入手したすべてのソースに次のような呼び出しが含まれていることです。

AEncoder().encode(object) 

これは、オブジェクトを json.dumps() に渡す前に呼び出す必要がありますが、事前にオブジェクトにアクセスすることはできません。前述の大きな辞書の中に隠されているため、私がアクセスできないこともあります。__repr__Aの関数も実装しようとしましたが、同じエラーが発生します。

だから... 要約されたバージョンを試すには:json.dumps()に渡される特定のオブジェクトにアクセスできない場合、カスタムクラスをどうするかをどのように伝えるのjson.dumps()ですか?

説明が必要な場合はお知らせください。

4

1 に答える 1

1

cls引数をdump関数に渡します。

json.dumps(obj, cls=AEncoder)

使用例を次に示します。

>>> class Something(object):
...    def __init__(self, v):
...       self.v = v
... 
>>> import json
>>> class SEncoder(json.JSONEncoder):
...    def default(self, obj):
...       if isinstance(obj, Something):
...          return {'classtype': 'Something', 'v': obj.v}
...       return json.JSONEncoder.default(self, obj)
... 
>>> s1 = Something(3)
>>> s2 = Something(4)
>>> o = [s1, s2, 6, "hello"]
>>> print json.dumps(o, cls=SEncoder, indent=2)
[
  {
    "classtype": "Something", 
    "v": 3
  }, 
  {
    "classtype": "Something", 
    "v": 4
  }, 
  6, 
  "hello"
]
于 2012-09-18T19:51:00.067 に答える