1

似たようなことを扱っているいくつかの質問を読みましたが、これについて質問したいと思いました。

ここで簡略化した2つのPythonクラスがあります。

class Service:
    def __init__(self):
        self.ServiceName = None
        self.ServiceExpDate = None

class Provision:
    def __init__(self):
        self.ID = None
        self.Type = None
        self.Services = [] # a list of Service objects

JSONに移動すると、Provisionクラスのインスタンスがエンコードされます。

jsonProvision = json.dumps(provision.__dict__)

サービスがない場合は正しい出力が得られますが、サービスクラスをシリアル化しようとすると次のようになります。

TypeError: <common.Service instance at 0x123d7e8> is not JSON serializable

これを直接処理するためにJSONエンコーダーを作成する必要がありますか、それともServiceクラスをシリアル化するためのより良い方法がありますか?

ありがとう!

4

2 に答える 2

1

クラスを処理するエンコーダーを作成する必要があります。これが、jsonモジュールの使用/拡張の方法です。

クラスインスタンスのをエンコードする試みは現在は機能する可能性が__dict__ありますProvisionが、クラスが進化した場合、将来の保証にはなりません。

于 2012-08-02T14:49:18.600 に答える
1

defaultカスタムクラスをパラメータとしてエンコードする関数を提供する必要がありますjson.dumps()。クラスのサンプルコード:

import json

class JSONEncodable(object):
    def json(self):
        return vars(self)

class Service(JSONEncodable):
    def __init__(self):
        self.ServiceName = None
        self.ServiceExpDate = None

class Provision(JSONEncodable):
    def __init__(self):
        self.ID = None
        self.Type = None
        self.Services = [] # a list of Service objects

使用例:

>>> from operator import methodcaller
>>> p = Provision()
>>> p.Services.append(Service())
>>> print json.dumps(p, default=methodcaller("json"))
{"Services": [{"ServiceName": null, "ServiceExpDate": null}], "Type": null, "ID": null}

default=attrgetter("__dict__")すべてのクラスでメソッドの必要性を回避するために使用することもできますjson()が、上記のアプローチはより柔軟です。

于 2012-08-03T10:06:13.270 に答える