Вложенная пользовательская десериализация с Джексоном - PullRequest
0 голосов
/ 11 февраля 2019

Я использую 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, но в обоих случаях я считаю, что смогу перехватить десериализацию только один раз и быть вынужден десериализовать весь объект в моем десериализаторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...