Пользовательская десериализация полиморфных объектов - PullRequest
1 голос
/ 07 июня 2019

Скажем, у меня есть следующая структура, которую я сериализовал в JSON.

public abstract class Vehicles {
    String make;
    String model;
    Map<Parts, int> partsList = new HashMap<>; // a list of parts for the vehicle and how much each part costs

    // Getters, setters, etc.
}

public class Cars extends Vehicles {
    int seats;

    // Getters, setters, etc.
}

public class Trucks extends Vehicles {
    int cargo;

    // Getters, setters, etc.
}

Затем мне нужен специальный десериализатор, который может обрабатывать partsList, который будет повторно использоваться каждый раз, когда конкретный дочерний элементкласс становится десериализованнымЯ видел несколько вопросов, описывающих, как вызывать пользовательский десериализатор для дочерних классов.Я не могу найти решение, которое также позволяет десериализовать свойства, созданные в суперклассе, избегая повторения кода десериализации в каждом дочернем подклассе.

public class VehicleDeserializer extends StdDeserializer<Vehicles> {
    protected VehicleDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Vehicle deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);

        TypeReference<Map<Parts, int>> typeReference = new TypeReference() {};
        Map<Parts, int> parts = objectMapper.readValue(jsonNode.get("partsList").asText(), typeReference) // somehow need to feed this to partsList map when each subclass is deserialized -- THIS IS THE BIT I DON'T KNOW HOW TO DO.

        // code to call the appropriate subclass deserializer -- I don't need help with this bit...yet.
}

РЕДАКТИРОВАТЬ: чтобы уточнить, я думаю, что естьБыло множество примеров того, как вызвать десериализатор соответствующего подкласса.Я хочу избежать повторяющегося кода в десериализаторе каждого подкласса для обработки карты в суперклассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...