У меня есть внешний сервис, который я использую для запроса некоторых данных.Данные будут в одном из двух форматов (первый из которых является «устаревшим», но его необходимо поддерживать):
{
"foo": "John Smith"
}
или
{
"foo": {
"name": "John Smith",
"bar": "baz"
}
}
, который я хочусопоставить со следующим POJO:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Outer {
private Foo foo;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Foo {
String name;
String bar;
}
}
Данные во втором формате (foo
- это объект) должны быть десериализованы, как и любой другой POJO, но данные в первом формате (foo
- это строка).), чтобы превратить его в экземпляр Foo
, я хочу позвонить new Foo(<foo>, null)
.Для этого я создал собственный десериализатор (@JsonComponent
означает, что этот десериализатор будет зарегистрирован с помощью своего рода глобального ObjectMapper
к весне через интерфейс Jackson Module
):
@JsonComponent
public class FooDeserializer extends JsonDeserializer<Outer.Foo> {
@Override
public Outer.Foo deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
JsonNode node = parser.getCodec().readTree(parser);
if (node.isTextual()) {
return new Foo(node.asText(), null);
}
return <delegate to next applicable deserializer>;
}
}
I 'У меня возникли проблемы с выяснением того, как выполнить часть «делегировать следующему применимому десериализатору», поскольку каждое решение, которое я пробовал (например, parser.getCodec().treeToValue(node, Outer.Foo.class)
), заканчивается тем, что снова использует тот же пользовательский десериализатор, вызывая бесконечную рекурсию.Это вообще возможно?