Python 指示将JSON字符串反序列化为对象时的类类型
我试图在Python中将JSON字符串反序列化为一个对象,同时指示每个对象的特定类类型。 下面是一个JSON示例:Python 指示将JSON字符串反序列化为对象时的类类型,python,json,Python,Json,我试图在Python中将JSON字符串反序列化为一个对象,同时指示每个对象的特定类类型。 下面是一个JSON示例: { "Vehicle": [ { "$type": "Car", "Make": 1982, "Settings": { "$type": "CarSettings", "ESP": true
{
"Vehicle":
[
{
"$type": "Car",
"Make": 1982,
"Settings":
{
"$type": "CarSettings",
"ESP": true
}
},
{
"$type": "Motorcycle",
"Make": 2010,
"Settings":
{
"$type": "MotorcycleSettings",
"ABS": true
}
}
]
}
请注意,我的类是这样构建的:
- 车辆
- 汽车:汽车
- 摩托车:汽车
- 背景
- 车辆设置:设置
- 摩托车设置:设置
谢谢 您定义的
object\u 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()
返回该对象,则汽车的字典('$type':'Car'
)将已经包含CarSettings
类型对象
{'$type': 'Car', 'Make': 1982, 'Settings': <__main__.CarSettings object at 0x000001FF4FD6A550>}
您定义的object\u 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()
返回该对象,则汽车的字典('$type':'Car'
)将已经包含CarSettings
类型对象
{'$type': 'Car', 'Make': 1982, 'Settings': <__main__.CarSettings object at 0x000001FF4FD6A550>}
您还可以创建一个从类型名称映射到类的字典,例如typemap={“Car”:Car,“Motorcycle”:Motorcycle,…}
然后执行返回typemap[dic['$type']](**dic)
而不是一堆if
语句。您还可以创建一个从类型名称映射到类的字典,例如typemap={“Car”:Car,“Motorcycle”:Motorcycle,…}
然后执行返回typemap[dic['$type']](**dic)
而不是一堆if
语句。