3 回答
TA贡献1871条经验 获得超13个赞
无需尝试注入ObjectMapper
您的自定义解串器。你可以使用:
ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();
如果您不需要 中的任何方法ObjectMapper
,则不需要强制转换:
ObjectCodec codec = jsonParser.getCodec();
TA贡献1744条经验 获得超4个赞
问题的原因,你正在这样做:
modules.add(new SimpleModule().addDeserializer(Vehicle.class, new VehicleDeserializer()));
您正在自己实例化该对象,因此映射器将为空。
TA贡献1821条经验 获得超6个赞
您在反序列化器中犯了一些错误:
因为您将反序列化器注册到反序列化器内的对象,所以您可以通过where is type
ObjectMapper
获取它。(ObjectMapper) parser.getCodec()
parser
JsonParser
findPath
方法返回JsonNode
并不String
总是.equals("")
返回false
。你应该使用isMissingNode
方法来代替。当您在对象上使用
readTree
方法时parser
,您不能再次使用它,因为反序列化已经完成并且您有一个JsonNode
. 从现在开始,你应该使用它。您可以使用convertValue
方法将其转换为所需的Class
。
事情应该是这样的:
class VehicleDeserializer extends JsonDeserializer<Vehicle> {
@Override
public Vehicle deserialize(JsonParser parser, DeserializationContext deserializationContext) throws IOException {
// cast to ObjectMapper
ObjectMapper mapper = (ObjectMapper) parser.getCodec();
// read JSON as tree to JsonNode object
// since now `parser` should not be used anymore.
JsonNode root = mapper.readTree(parser);
Vehicle vehicle = null;
if (!root.findPath("carDriverName").isMissingNode()) {
vehicle = mapper.convertValue(root, Car.class);
} else if (!root.findPath("autoDriverName").isMissingNode()) {
vehicle = mapper.convertValue(root, Auto.class);
}
return vehicle;
}
}
添加回答
举报