亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我嘗試反序列化抽象類時,Jackson Objectmapper 在配置為 bean 后未由

當我嘗試反序列化抽象類時,Jackson Objectmapper 在配置為 bean 后未由

jeck貓 2023-07-13 14:10:47
我在 Spring Boot 應用程序中使用 Jackson xml 版本 2.9.9。我有一個接受 Vehicle 的控制器,它是一個具有 2 個子類的抽象類。當我從郵遞員傳遞 JSON 數據時,我無法反序列化車輛,因為自動連接的對象映射器始終為空(我將對象映射器配置為 bean,因為我將反序列化器設置為映射器的簡單模塊)。@RequestMapping(path = "/jackson", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)? ? public void forSingleObject(@RequestBody MyModel myModel){? ? ? ? System.out.println("Deserialization successful");? ? }MyModel.javapublic class MyModel {? ? private String name;? ? private Vehicle value;}Vehicle.javapublic abstract class Vehicle {? ? private String vehicleName;}Car.javapublic class Car extends Vehicle{? ? private String carType;? ? private String carDriverName;}Auto.javapublic class Auto extends Vehicle {? ? private String autoType;? ? private String autoDriverName;}ObjectMapper bean 配置@Configurationpublic class MapperConfig {? ? @Bean? ? public ObjectMapper objectMapper(){? ? ? ? ObjectMapper objectMapper = new ObjectMapper();//Jackson2ObjectMapperBuilder.json().build();? ? ? ? List<Module> modules = new ArrayList<>();? ? ? ? modules.add(new SimpleModule().addDeserializer(Vehicle.class, new VehicleDeserializer()));? ? ? ? objectMapper.registerModules(modules);? ? ? ? return objectMapper;? ? }}VehicleDeserializer.javapublic class VehicleDeserializer extends JsonDeserializer<Vehicle> {? ? @Autowired? ? private ObjectMapper objectMapper;? ? @Override? ? public Vehicle deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {? ? ? ? JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);? ? ? ? Vehicle vehicle=null;? ? ? ? if (!jsonNode.findPath("carDriverName").equals("")){? ? ? ? ? ? vehicle = objectMapper.readValue(jsonParser, Car.class);? ? ? ? }else if (!jsonNode.findPath("autoDriverName").equals("")){? ? ? ? ? ? vehicle = objectMapper.readValue(jsonParser, Auto.class);? ? ? ? }? ? ? ? return vehicle;? ? }
查看完整描述

3 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

無需嘗試注入ObjectMapper您的自定義解串器。你可以使用:

ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();

如果您不需要 中的任何方法ObjectMapper,則不需要強制轉換:

ObjectCodec codec = jsonParser.getCodec();


查看完整回答
反對 回復 2023-07-13
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

問題的原因,你正在這樣做:

modules.add(new SimpleModule().addDeserializer(Vehicle.class, new VehicleDeserializer()));

您正在自己實例化該對象,因此映射器將為空。


查看完整回答
反對 回復 2023-07-13
?
達令說

TA貢獻1821條經驗 獲得超6個贊

您在反序列化器中犯了一些錯誤:

  • 因為您將反序列化器注冊到反序列化器內的對象,所以您可以通過where is typeObjectMapper獲取它。(ObjectMapper) parser.getCodec()parserJsonParser

  • 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;

    }

}


查看完整回答
反對 回復 2023-07-13
  • 3 回答
  • 0 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號