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您可以注释baseCar
类,告诉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
与基类关联,而无需将其直接添加到该类中。