gpt4 book ai didi

java - jackson 将对象列表反序列化为 map

转载 作者:行者123 更新时间:2023-12-04 03:07:50 25 4
gpt4 key购买 nike

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

@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 是一个基类, map 应该有 Map String, SubClasses of Cars)

Input JSON = [{"name": "honda", "type": "Regular , "speed": 60}]

这应该在 map 中,例如 Map.put("honda", RegularCar.class)

最佳答案

你可以注释 base Car class 告诉 Jackson 根据 "type" 的值实例化哪些子类JSON 中的字段。例如,如果您有 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在那里然后适本地转换你的东西get来自 Map .

关于java - jackson 将对象列表反序列化为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47490034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com