Для того, чтобы это работало, вы оба должны встраивать некоторую информацию о типе объекта в данные (где она полезна только для десериализации) и обычно использовать определение внешней схемы, которое в противном случае не понадобилось бы (например, XML-схема для xml), поскольку это в основном универсальный тип. система типов).
Это имеет те же проблемы, что и ORM: Hibernate должен использовать уродливые обходные пути (n + 1 - двусторонние объединения, «супер таблицы» или поля дискриминатора).
Или другой способ выразить это: сопоставление / связывание данных не совсем то же самое, что сериализация / десериализация объекта (последний пытается сохранить больше идентичности объекта).
Здесь я предполагаю, что вы хотите что-то вроде:
Pet pet = mapper.readValue(jsonString, Pet.class);
// (and possibly get an exception if Pet is an abstract class...)
Leash l = ((Dog) pet).getLeash();
Если это не так, вы можете просто связать с Dog
Dog dog = mapper.readValue(jsonString, Dog.class);
Так или иначе: у проекта Джексона есть запрос о том, чтобы сделать именно это , что позволяет вам делать то, что (я думаю) вы хотите.
Однако это решение в основном будет работать для Java, поскольку не существует стандартного способа передачи информации о типе объекта в JSON. С XML это можно сделать с помощью определенной в XML-схеме атрибута «xsi: type»; который идентифицирует тип Schema, который затем отображается на класс (да, довольно сложный способ, но он работает).
ОБНОВЛЕНИЕ : Джексон 1.5 добавил поддержку для этого (т.е. реализовал запрос функции JACKSON-91), так что его можно использовать для генерации идентификаторов типов, чтобы обеспечить надлежащую обработку полиморфных типов , Он также должен работать с не-Java системами, учитывая, что вы можете полностью настроить детали того, как должна включаться информация о типах; и НЕ ограничивается использованием имен классов Java.