3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
無需嘗試注入ObjectMapper
您的自定義解串器。你可以使用:
ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();
如果您不需要 中的任何方法ObjectMapper
,則不需要強(qiáng)制轉(zhuǎn)換:
ObjectCodec codec = jsonParser.getCodec();

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題的原因,你正在這樣做:
modules.add(new SimpleModule().addDeserializer(Vehicle.class, new VehicleDeserializer()));
您正在自己實(shí)例化該對象,因此映射器將為空。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
您在反序列化器中犯了一些錯誤:
因?yàn)槟鷮⒎葱蛄谢髯缘椒葱蛄谢鲀?nèi)的對象,所以您可以通過where is type
ObjectMapper
獲取它。(ObjectMapper) parser.getCodec()
parser
JsonParser
findPath
方法返回JsonNode
并不String
總是.equals("")
返回false
。你應(yīng)該使用isMissingNode
方法來代替。當(dāng)您在對象上使用
readTree
方法時(shí)parser
,您不能再次使用它,因?yàn)榉葱蛄谢呀?jīng)完成并且您有一個(gè)JsonNode
. 從現(xiàn)在開始,你應(yīng)該使用它。您可以使用convertValue
方法將其轉(zhuǎn)換為所需的Class
。
事情應(yīng)該是這樣的:
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;
}
}
添加回答
舉報(bào)