Динамическая полиморфная обработка типов с помощью Jackson

У меня есть иерархия классов, подобная этой:

public static class BaseConfiguration {
}

public abstract class Base {
  private BaseConfiguration configuration;
  public String id;

  public BaseConfiguration getConfiguration() { ... }
  public void setConfiguration(BaseConfiguration configuration) { ... }
}

public class A extends Base {
   public static class CustomConfigurationA extends BaseConfiguration {
       String filename;
       String encoding;
   }

   CustomConfigurationA getConfiguration() { ... }
}

class B extends Base {
   public static class CustomConfigurationB extends BaseConfiguration {
       /* ... */
   }

   CustomConfigurationB getConfiguration() { ... }
}

И входные данные json, подобные этой (которые я не могу изменить самостоятельно)

{
    "id":"File1",
    "configuration":{
         "filename":"...",
         "encoding":"UTF-8"
     }
}

Я разбираю JSON в Java с помощью Jackson следующим образом

ObjectMapper mapper = new ObjectMapper();
value = mapper.readValue(in, nodeType);

Я хочу десериализовать классы A, B и другие из JSON с помощью JAVA/Jackson. В JSON нет (и не может быть) информации о типе, встроенной в JSON. Я не могу использовать аннотации на классы (они мне не принадлежат) и я (полагаю) не могу использовать миксины, так как существует потенциально произвольное количество классов, таких как A & B (а миксины не являются динамическими). Хорошо то, что код десериализации знает, какой правильный пользовательский класс использовать для десериализации (в принципе, есть известное отображение от класса к классу конфигурации), но я не знаю, как заставить Jackson распознать эту информацию при десериализации JSON.

Короче говоря: я хочу иметь возможность определять тип десериализации объекта конфигурации в зависимости от типа окружающего класса, устанавливая все необходимое в ObjectMapper. Как этого можно добиться?

13
задан adriano 22 November 2011 в 11:29
поделиться