2017-11-25 196 views
2

我有我自己的自定义解串器杰克逊反序列化列表

@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; 
} 

想到这里不起作用,因为Car是一个基类,地图应该有地图的字符串,汽车的子类)

输入JSON = [{ “名称”: “本田”, “类型”:“普通, “速度”:60}]

这应该是在地图如Map.put("honda", RegularCar.class)

+0

我只是想知道为什么你不反序列化的汽车列表,然后在单独的方法/类转换它映射? – Pulkownik

+0

@Pulkownik我实际上有麻烦deserializng汽车“mapper.readValue(node.asText(),Car.class)”这似乎并不工作 – user3100209

+0

你的汽车类是怎么样的?你使用@JsonDeserialize? – Pulkownik

回答

0

您可以注释基类Car类,告诉Jackson根据JSON中的"type"字段的值实例化哪个子类。例如,如果您有RegularCarClassicCar延伸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实例。由于容器宣布为Map<String, Car<?, ?>> CarsMap,这正是您想要put那里,然后适当地从Map投下你get什么。

+0

我想这样做没有注释,因为那样我就与杰克逊紧密结合 – user3100209