当我尝试反序列化抽象类时,Jackson Objectmapper 在配置为 bean 后未由

我在 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.java


public class MyModel {

    private String name;

    private Vehicle value;

}

Vehicle.java


public abstract class Vehicle {

    private String vehicleName;

}

Car.java


public class Car extends Vehicle{

    private String carType;

    private String carDriverName;

}

Auto.java


public class Auto extends Vehicle {

    private String autoType;

    private String autoDriverName;

}

ObjectMapper bean 配置


@Configuration

public 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.java


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

    }



jeck猫
浏览 218回答 3
3回答

慕桂英4014372

无需尝试注入ObjectMapper您的自定义解串器。你可以使用:ObjectMapper&nbsp;mapper&nbsp;=&nbsp;(ObjectMapper)&nbsp;jsonParser.getCodec();如果您不需要 中的任何方法ObjectMapper,则不需要强制转换:ObjectCodec&nbsp;codec&nbsp;=&nbsp;jsonParser.getCodec();

慕无忌1623718

问题的原因,你正在这样做:modules.add(new&nbsp;SimpleModule().addDeserializer(Vehicle.class,&nbsp;new&nbsp;VehicleDeserializer()));您正在自己实例化该对象,因此映射器将为空。

达令说

您在反序列化器中犯了一些错误:因为您将反序列化器注册到反序列化器内的对象,所以您可以通过where&nbsp;is&nbsp;typeObjectMapper获取它。(ObjectMapper) parser.getCodec()parserJsonParserfindPath方法返回JsonNode并不String总是.equals("")返回false。你应该使用isMissingNode方法来代替。当您在对象上使用readTree方法时parser,您不能再次使用它,因为反序列化已经完成并且您有一个JsonNode.&nbsp;从现在开始,你应该使用它。您可以使用convertValue方法将其转换为所需的Class。事情应该是这样的:class VehicleDeserializer extends JsonDeserializer<Vehicle> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Vehicle deserialize(JsonParser parser, DeserializationContext deserializationContext) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; // cast to ObjectMapper&nbsp; &nbsp; &nbsp; &nbsp; ObjectMapper mapper = (ObjectMapper) parser.getCodec();&nbsp; &nbsp; &nbsp; &nbsp; // read JSON as tree to JsonNode object&nbsp; &nbsp; &nbsp; &nbsp; // since now `parser` should not be used anymore.&nbsp; &nbsp; &nbsp; &nbsp; JsonNode root = mapper.readTree(parser);&nbsp; &nbsp; &nbsp; &nbsp; Vehicle vehicle = null;&nbsp; &nbsp; &nbsp; &nbsp; if (!root.findPath("carDriverName").isMissingNode()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vehicle = mapper.convertValue(root, Car.class);&nbsp; &nbsp; &nbsp; &nbsp; } else if (!root.findPath("autoDriverName").isMissingNode()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vehicle = mapper.convertValue(root, Auto.class);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return vehicle;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java