Java中通过Jackson进行多级继承的多态反序列化

问题描述 投票:0回答:1

如何反序列化以下示例,以便 Jackson 自动为我提供正确的对象

public class vehicle {
String vehicleType;
}

public class car extends vehicle {
String carType;
String make;
}

public class sedan extends car {
String model;
}

我理想的情况是将 json 结构传递给以下代码,并创建正确子类型的对象。 例如:

        ObjectMapper mapper = new ObjectMapper();
        vehicle myVehicle = mapper.readValue(inputData, vehicle.class);
        Assertions.assertInstanceOf(sedan.class, myVehicle);

上述测试对于以下 json 数据应该成立

{
"vehicleType" : "car",
"carType" : "sedan",
"make" : "Foo",
"model" : "Bar"
}

我可以使用某些东西正确获得最多 1 级继承,以达到以下效果

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "vehicleType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = car.class, name = "car")
})
public class vehicle {...}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "carType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = sedan.class, name = "sedan")
})
public class car extends vehicle {...}

public class sedan extends car {...}

当我运行上面的代码时,我得到一个 car 类型的对象,而不是 sedan 类型的对象。

java inheritance jackson polymorphism
1个回答
0
投票

您需要在

vehicle
中列出所有子类型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "vehicleType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = car.class, name = "car"),
        @JsonSubTypes.Type(value = sedan.class, name = "sedan")
})
public class vehicle {...}
© www.soinside.com 2019 - 2024. All rights reserved.