Я использую API с Джексоном, для которого некоторые объекты являются "встраиваемыми".По умолчанию API предоставит идентификатор объекта.Однако если объект выбран для встраивания, он заменит id на обернутый объект.Например, я мог бы получить следующий ответ JSON:
{
"data": {
"foo": "abc123"
"bar": "def456"
}
}
или, если я выбрал "embed" foo
, я бы получил:
{
"data": {
"foo": {
"data": {
"id": "abc123",
"value": 100
}
},
"bar": "def456"
}
}
Кроме того, вы можете гнездо вставляет.Значение foo
может иметь bar
внутри, которое также внедрено и обернуто в data
объект.Так что это сводится к нескольким требованиям:
- Мне нужно десериализовать объект Foo независимо от того, был ли он внедрен.
- Я хочу развернуть внедренные объекты перед десериализацией.
Я мог решить большинство проблем с помощью пользовательской десериализации.Для приведенного выше примера я могу определить пользовательский JsonDeserializer
для Foo
.В первом ответе будет создан объект Foo
, для которого установлено только поле идентификатора, во втором ответе будет проигнорирован узел данных и десериализован объект как обычно.
Однако, это может привести к путанице, поскольку эти объекты могутвложенный.В идеале я хотел бы иметь возможность перехватывать десериализацию каждый раз, когда встраиваемый объект начинает десериализовываться, выполнять некоторые пользовательские действия, возвращаться к нормальному потоку и перехватывать десериализацию снова , когда следующий встраиваемый объект начинаетдесериализовано.
Примечание: я смотрел на BeanDeserializeModifier
и @JsonDeserialize
, но в обоих случаях я считаю, что смогу перехватить десериализацию только один раз и быть вынужден десериализовать весь объект в моем десериализаторе.