Deserialize a json string to an object in python

后端 未结 12 2447
囚心锁ツ
囚心锁ツ 2020-11-28 05:01

I have the following string

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

I Want to deserialize to a object of cla

12条回答
  •  猫巷女王i
    2020-11-28 05:21

    While Alex's answer points us to a good technique, the implementation that he gave runs into a problem when we have nested objects.

    class more_info
        string status
    
    class payload
        string action
        string method
        string data
        class more_info
    

    with the below code:

    def as_more_info(dct):
        return MoreInfo(dct['status'])
    
    def as_payload(dct):
        return Payload(dct['action'], dct['method'], dct['data'], as_more_info(dct['more_info']))
    
    payload = json.loads(message, object_hook = as_payload)
    

    payload.more_info will also be treated as an instance of payload which will lead to parsing errors.

    From the official docs:

    object_hook is an optional function that will be called with the result of any object literal decoded (a dict). The return value of object_hook will be used instead of the dict.

    Hence, I would prefer to propose the following solution instead:

    class MoreInfo(object):
        def __init__(self, status):
            self.status = status
    
        @staticmethod
        def fromJson(mapping):
            if mapping is None:
                return None
    
            return MoreInfo(
                mapping.get('status')
            )
    
    class Payload(object):
        def __init__(self, action, method, data, more_info):
            self.action = action
            self.method = method
            self.data = data
            self.more_info = more_info
    
        @staticmethod
        def fromJson(mapping):
            if mapping is None:
                return None
    
            return Payload(
                mapping.get('action'),
                mapping.get('method'),
                mapping.get('data'),
                MoreInfo.fromJson(mapping.get('more_info'))
            )
    
    import json
    def toJson(obj, **kwargs):
        return json.dumps(obj, default=lambda j: j.__dict__, **kwargs)
    
    def fromJson(msg, cls, **kwargs):
        return cls.fromJson(json.loads(msg, **kwargs))
    
    info = MoreInfo('ok')
    payload = Payload('print', 'onData', 'better_solution', info)
    pl_json = toJson(payload)
    l1 = fromJson(pl_json, Payload)
    
    

提交回复
热议问题