Java Jackson将对象列表反序列化为映射

Java Jackson将对象列表反序列化为映射,java,json,jackson,jackson-modules,jackson-databind,Java,Json,Jackson,Jackson Modules,Jackson Databind,我有自己的自定义反序列化程序 @Override public Map<String, Car<?, ?>> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode carsNode = p.getCodec().readTree(p); Map<String, Car&

我有自己的自定义反序列化程序

@Override
public Map<String, Car<?, ?>> deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    JsonNode carsNode = p.getCodec().readTree(p);
    Map<String, Car<?, ?>> CarsMap = new HashMap<String, Car<?, ?>>();
    ObjectMapper mapper = new ObjectMapper();

    for (JsonNode node : carsNode) {
        CarsMap.put(node.get("name").asText(), mapper.readValue(node.asText(), Car.class));
    }
    return CarsMap;
}
@覆盖

public Map>CarsMap=new HashMap您可以注释base
Car
类,告诉Jackson根据JSON中
“type”
字段的值实例化哪些子类。例如,如果您有
RegularCar
ClassicCar
扩展
Car

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = RegularCar.class, name = "Regular"),
    @JsonSubTypes.Type(value = ClassicCar.class, name = "Classic")
})
class Car {
这将允许您进行如下解析:

String json = "{\"name\": \"honda\", \"type\": \"Regular , \"speed\": 60}";
Car car = mapper.readValue(json, Car.class);

其中
Car-Car
实际上指向一个
RegularCar
实例。既然容器被声明为
MapI,我只是想知道为什么不反序列化到car列表,然后在单独的方法/类中将其转换为map?@Pulkownik我实际上很难反序列化car“mapper.readValue(node.astex(),car.class)”,这似乎不起作用,您的car类看起来如何?您是否使用@JsonDeserialize?@Pulkownik非常简单,如果我使用实际的类型示例mapper.readvalue(data,regularcar.class)进行设计,它可以工作,但不能与基类mapper.readvalue(data,car.class)一起工作好的,所以你们应该阅读这里的热点来处理jackson中的子类。我不想做注释,因为我与Jackson@user3100209您可以将
@JsonSubTypes
替换为以编程方式注册子类型的
Module
。您还可以使用“混合注释”将
@JsonTypeInfo
与基类关联,而无需将其直接添加到该类中。