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;
}
}
添加回答
舉報