指示将JSON字符串反序列化为Obj时的类类型

2024-09-30 16:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Python中将一个JSON字符串反序列化为一个对象,同时指出每个对象的特定类类型。 下面是一个JSON示例:

{
    "Vehicle":
    [
        {
            "$type": "Car",
            "Make": 1982,
            "Settings":
            {
                "$type": "CarSettings",
                "ESP": true
            }
        },
        {
            "$type": "Motorcycle",
            "Make": 2010,
            "Settings":
            {
                "$type": "MotorcycleSettings",
                "ABS": true
            }
        }
    ]
}

请注意,我的类是这样构建的:

  • 车辆
  • 汽车:车辆
  • 摩托车:车辆

以及:

  • 设置
  • 车辆设置:设置
  • 摩托车设置:设置

我用一个表示整个JSON的单一类型来计算它json.loads文件但我似乎无法使它适用于子类。你知道吗

谢谢!你知道吗


Tags: 对象字符串jsontrue示例类型make序列化
1条回答
网友
1楼 · 发布于 2024-09-30 16:36:07

您定义的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类型的对象。你知道吗

{'$type': 'Car', 'Make': 1982, 'Settings': <__main__.CarSettings object at 0x000001FF4FD6A550>}

如果您有许多类,那么可以制作一个字典,为typename排序一个类型,并使用它创建对象。你知道吗

types = {
  'Car' : Car,
  'Motorcycle' : Motorcycle,
}

def hook(dic):
  try:
     return types[dic['$type']](**dic)
  except KeyError:
     pass

相关问题 更多 >