在将JSON字符串反序列化为Object时指示类类型

时间:2018-12-27 16:38:44

标签: python json

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

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

请注意,我的课程是通过以下方式构建的:

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

和:

  • 设置
  • CarSettings:设置
  • MotorcycleSettings:设置

我想出了一个单个类型,它使用带有“ object_hook”的“ json.loads”表示整个JSON,但我似乎无法使其适用于子类。

谢谢!

1 个答案:

答案 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