Джексон Изменить JsonIgnore Динамически - PullRequest
29 голосов
/ 18 ноября 2011

У меня есть класс, и внутри него тоже есть переменные.Иногда я хочу игнорировать некоторые поля, а иногда нет при десериализации (возможно, при сериализации тоже).Как я могу сделать это в Джексоне?

Ответы [ 3 ]

22 голосов
/ 19 ноября 2011

Для сериализации должна помочь запись блога " filtering properties ".Сторона десериализации имеет меньшую поддержку, так как более распространено желание отфильтровывать написанное.

Один из возможных подходов - это подкласс JacksonAnnotationIntrospector, переопределить методы, которые анализируют невосприимчивость методов (и / или поля) для использования любой логики, которую вы хотите.

Также может помочь, если вы привели пример практического применения, то есть, что и почему вы пытаетесь предотвратить десериализацию.

1 голос
/ 28 июня 2016

Возможно, вы захотите использовать JsonViews (изначально взято из http://wiki.fasterxml.com/JacksonJsonViews - теперь не работает - ссылка на веб-архив: https://web.archive.org/web/20170831135842/http://wiki.fasterxml.com/JacksonJsonViews)

Цитируя это:

Во-первых, определение представлений означает объявление классов; Вы можете повторно использовать существующие или просто создавать фиктивные классы - они являются просто идентификаторами представления с информацией об отношениях (ребенок наследует членство в представлении от родителей):

 // View definitions:
  class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

  public class Bean {
            // Name is public
            @JsonView(Views.Public.class) String name;
            // Address semi-public
            @JsonView(Views.ExtendPublic.class) Address address;
            // SSN only for internal usage
            @JsonView(Views.Internal.class) SocialSecNumber ssn;
  }

При таких определениях представлений сериализация будет выполняться следующим образом:

 // short-cut:
  objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

  // or fully exploded:
  objectMapper.getSerializationConfig().setSerializationView(Views.Public.class);
  // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse)
  objectMapper.writeValue(out, beanInstance); // will use active view set via Config

  // or, starting with 1.5, more convenient (ObjectWriter is reusable too)
  objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
and result would only contain 'name', not 'address' or 'ssn'.
0 голосов
/ 18 ноября 2011

Вам, вероятно, стоит взглянуть на функцию модулей последних версий Джексона.

Одним из возможных механизмов было бы использование BeanDeserializerModifier .

Я искал полезное онлайн-руководство или пример, но сразу ничего не появляется. Возможно, можно что-то проработать, если о вашем контексте известно больше. Вы управляете своими ObjectMapper s вручную или используете их в настройках JAX-RS, внедряете в Spring или как?

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