次の文字列があります
{"action":"print","method":"onData","data":"Madan Mohan"}
クラスのオブジェクトにデシリアライズしたい
class payload
string action
string method
string data
私はpython 2.6と2.7を使用しています
>>> j = '{"action": "print", "method": "onData", "data": "Madan Mohan"}'
>>> import json
>>>
>>> class Payload(object):
... def __init__(self, j):
... self.__dict__ = json.loads(j)
...
>>> p = Payload(j)
>>>
>>> p.action
'print'
>>> p.method
'onData'
>>> p.data
'Madan Mohan'
サミの答えを詳しく説明するには:
ドキュメントから:
class Payload(object):
def __init__(self, action, method, data):
self.action = action
self.method = method
self.data = data
import json
def as_payload(dct):
return Payload(dct['action'], dct['method'], dct['data'])
payload = json.loads(message, object_hook = as_payload)
に対する私の反論
.__dict__
解決策は、それが仕事をして簡潔である一方で、Payload クラスが完全に汎用的になり、そのフィールドを文書化しないことです。
たとえば、ペイロード メッセージが予期しない形式の場合、ペイロードが作成されたときにキーが見つからないというエラーをスローする代わりに、ペイロードが使用されるまでエラーは生成されません。
Python の最近のバージョンでは、 marshmallow-dataclassを使用できます。
from marshmallow_dataclass import dataclass
@dataclass
class Payload
action:str
method:str
data:str
Payload.Schema().load({"action":"print","method":"onData","data":"Madan Mohan"})
オブジェクト作成用にエンコーダを特殊化できます: http://docs.python.org/2/library/json.html
import json
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, complex):
return {"real": obj.real,
"imag": obj.imag,
"__class__": "complex"}
return json.JSONEncoder.default(self, obj)
print json.dumps(2 + 1j, cls=ComplexEncoder)