#json #object #jaxb #adapter #jackson
#json #объект #jaxb #адаптер #джексон
Вопрос:
Существует множество примеров того, как отображать в JAXB с использованием XmlTypeAdapters, и это здорово.
Однако моя ситуация такова, что у меня есть поле, которое может иметь любой тип (т. Е.: Object.class в Java). Я хочу использовать адаптер, который в основном передает мне все управление для сортировки / отмены сортировки для этого поля. Опять же, я не знаю входящий тип, и я не знаю исходящий тип, кроме как во время выполнения.
Например:
@XmlRootElement( name="myType" )
@XmlAccessorType(XmlAccessType.FIELD)
class MyType {
@XmlElement("value")
@XmlJavaTypeAdapter(ValueAdapter.class)
private Object value;
public static class ValueAdapter extends XmlAdapter<Object, Object> {
public ValueAdapter() {
}
public Object marshal(Object value) {
if (value instanceof Date) {
// do date stuff
}
else if (value instanceof Foo) {
// do foo stuff
}
// ... etc ...
else {
return value;
}
}
public Object unmarshal(Object value) {
if (value instanceof Date) {
// do date stuff
}
else if (value instanceof Foo) {
// do foo stuff
}
// ... etc ...
else {
return value;
}
}
}
// getter/setter fluff ...
}
Однако при использовании Jackson ValueAdapter не вызывается.
Это правильный способ сделать это в JAXB? Если нет, то как это сделать?
Комментарии:
1. Гааа! 1 очко для меня. Я не видел, чтобы в адаптере были достигнуты точки останова. После очистки моего проекта в моей IDE точки останова достигаются, как и ожидалось, и вышеуказанные решения работают. Я надеюсь, что это кому-то поможет.
Ответ №1:
Рад, что это работает. Теперь, поскольку вы используете Jackson, также может быть полностью автоматизированный способ.
В частности, для полиморфных типов вы часто можете получить надлежащую обработку с помощью @JsonTypeInfo
аннотации — она добавит информацию о типе при сериализации, используйте это при десериализации. И пока у реальных конкретных типов есть обработчики (стандартные типы JDK, beans, коллекции других обрабатываемых типов), это все, что вам нужно.