我正在尝试将JSON字符串反序列化为Python中的对象,同时指示每个对象的特定类类型。 这是一个示例JSON:
{
"Vehicle":
[
{
"$type": "Car",
"Make": 1982,
"Settings":
{
"$type": "CarSettings",
"ESP": true
}
},
{
"$type": "Motorcycle",
"Make": 2010,
"Settings":
{
"$type": "MotorcycleSettings",
"ABS": true
}
}
]
}
请注意,我的课程是通过以下方式构建的:
和:
我想出了一个单个类型,它使用带有“ object_hook”的“ json.loads”表示整个JSON,但我似乎无法使其适用于子类。
谢谢!
答案 0 :(得分:3)
您定义的object_hook
将从JSON字符串中获取字典。举个例子:
def hook(dic):
print(dic)
return dic
将其用作钩子,在您的示例中将产生:
{'$type': 'CarSettings', 'ESP': True}
{'$type': 'Car', 'Make': 1982, 'Settings': {'$type': 'CarSettings', 'ESP': True}}
{'$type': 'MotorcycleSettings', 'ABS': True}
{'$type': 'Motorcycle', 'Make': 2010, 'Settings': {'$type': 'MotorcycleSettings', 'ABS': True}}
因此,在hook()
函数中,您将使用 $ type 元素并根据该元素进行操作。
def hook(dic):
if dic['$type'] == "Car":
return Car(**dic) # assuming Car constructor can take kwargs
if dic['$type'] == "Motorcycle":
return Motorcycle(**dic) # assuming Motorcycle constructor can take kwargs
hook()
将首先在嵌套最多的字典上调用。因此,如果您解析 CarSettings 并从hook()
返回该对象,则Car('$type': 'Car'
)的字典将已经包含CarSettings
类型的对象。 / p>
{'$type': 'Car', 'Make': 1982, 'Settings': <__main__.CarSettings object at 0x000001FF4FD6A550>}
如果您有很多类,请制作一个字典来为类型名排序,然后将其用于对象创建。
types = {
'Car' : Car,
'Motorcycle' : Motorcycle,
}
def hook(dic):
try:
return types[dic['$type']](**dic)
except KeyError:
pass