首页 > 解决方案 > 从 Python 中的 Laravel 队列中反序列化复杂的 PHP 对象

问题描述

我正在尝试获取存储在此 Laravel 队列消息中的项目的 ID。我正在使用 Python 和库 phpserialize。

这是字符串:

'O:26:"App\\Jobs\\GetMatchReportJob":12:{s:10:"\x00*\x00patient";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":4:{s:5:"class";s:11:"App\\Patient";s:2:"id";i:3;s:9:"relations";a:0:{}s:10:"connection";s:5:"pgsql";}s:5:"tries";i:3;s:10:"retryAfter";i:30;s:7:"timeout";i:25;s:10:"connection";N;s:5:"queue";s:14:"optimas-result";s:15:"chainConnection";N;s:10:"chainQueue";N;s:5:"delay";N;s:10:"middleware";a:0:{}s:7:"chained";a:0:{}s:6:"\x00*\x00job";N;}'

如您所见,我在一个对象中有一个对象。

我正在尝试创建一个对象挂钩,如下所示:

class Patient(object):
    def __init__(self, data):
        self.data = data

def object_hook(data, d):
    cls = {'App\Jobs\GetMatchReportJob': Patient}['Illuminate\Contracts\Database\ModelIdentifier']
    return cls(**d)

显然,这是错误的。如何创建对象挂钩来检索对象中的对象?

非常感谢

标签: pythonjsonlaravelserializationhook

解决方案


我面临类似的问题 - (仍在尝试完全修复它)但我希望这可以帮助那里的人。使用 object_hook=ChainMap

例子 :

from phpserialize import loads
from collections import ChainMap, UserDict, namedtuple, Counter, OrderedDict, 
defaultdict, deque, UserList, UserString
data = loads(b'O:26:"App\\Jobs\\GetMatchReportJob":12:{s:10:"\x00*\x00patient";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":4:{s:5:"class";s:11:"App\\Patient";s:2:"id";i:3;s:9:"relations";a:0:{}s:10:"connection";s:5:"pgsql";}s:5:"tries";i:3;s:10:"retryAfter";i:30;s:7:"timeout";i:25;s:10:"connection";N;s:5:"queue";s:14:"optimas-result";s:15:"chainConnection";N;s:10:"chainQueue";N;s:5:"delay";N;s:10:"middleware";a:0:{}s:7:"chained";a:0:{}s:6:"\x00*\x00job";N;}', object_hook=ChainMap)
print(data)
print(data.maps)

推荐阅读