Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 指示将JSON字符串反序列化为对象时的类类型_Python_Json - Fatal编程技术网

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

Python 指示将JSON字符串反序列化为对象时的类类型,python,json,Python,Json,我试图在Python中将JSON字符串反序列化为一个对象,同时指示每个对象的特定类类型。 下面是一个JSON示例: { "Vehicle": [ { "$type": "Car", "Make": 1982, "Settings": { "$type": "CarSettings", "ESP": true

我试图在Python中将JSON字符串反序列化为一个对象,同时指示每个对象的特定类类型。 下面是一个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的单一类型解决了这个问题,但我似乎无法使它适用于子类


谢谢

您定义的
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
语句。