82

次の文字列があります

{"action":"print","method":"onData","data":"Madan Mohan"}

クラスのオブジェクトにデシリアライズしたい

class payload
    string action
    string method
    string data

私はpython 2.6と2.7を使用しています

4

12 に答える 12

143
>>> 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'
于 2013-03-18T12:47:00.280 に答える
58

サミの答えを詳しく説明するには:

ドキュメントから:

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 クラスが完全に汎用的になり、そのフィールドを文書化しないことです。

たとえば、ペイロード メッセージが予期しない形式の場合、ペイロードが作成されたときにキーが見つからないというエラーをスローする代わりに、ペイロードが使用されるまでエラーは生成されません。

于 2013-05-30T00:21:32.543 に答える
8

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"})
于 2019-02-24T13:38:07.860 に答える
5

オブジェクト作成用にエンコーダを特殊化できます: 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)
于 2013-03-18T12:36:55.103 に答える