Класс и уровень поля @JsonView аннотация и Object Mapper - PullRequest
0 голосов
/ 27 марта 2019

У меня есть views и entity класс, как показано ниже:

class Views{
   class ViewOne{}
   class ViewTwo{}
}

class Test{

   @JsonView({Views.ViewOne.class})
   public int x;

   @JsonView({Views.ViewTwo.class})
   public int y;

   public int z;

   public int v;
}

Мой вопрос заключается в том, нужно ли мне иметь @JsonView({Views.ViewOne.class, Views.ViewTwo.class}) на уровне класса, чтобы у меня были неаннотированные поля, такие какz, v в выходном ответе независимо от класса представления, переданного в Object Mapper?

Я пытался изучить различные ресурсы, касающиеся использования уровня класса @JsonView аннотации , но я не смог 'не могу найти.Имеет ли это какое-либо влияние?Если да, пожалуйста, объясните тоже самое.

1 Ответ

1 голос
/ 27 марта 2019

Нужно ли иметь @JsonView({Views.ViewOne.class, Views.ViewTwo.class}) на уровне класса, чтобы у меня были неотмеченные поля, такие как z, v в выходном ответе, независимо от класса представления, переданного в ObjectMapper?

Вам это не понадобится, когда MapperFeature.DEFAULT_VIEW_INCLUSION включен в вашем экземпляре ObjectMapper. Эта функция включена по умолчанию . Может быть, вы как-то отключили его?

Вот цитата из документации:

Функция, определяющая, включены ли свойства, у которых нет аннотаций видов, в представления сериализации JSON (для получения дополнительной информации о представлениях JSON смотрите @JsonView). Если включено, неаннотированные свойства будут включены; если они отключены, они будут исключены.


Пример 1

Давайте рассмотрим следующий Example класс:

@Data
public class Example {

    private int a = 1;

    private int b = 2;

    private int c = 3;
}

И давайте сериализуем экземпляр Example как JSON, используя:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new Foo());

Он выдаст следующий JSON:

{"a":1,"b":2,"c":3}

Пример 2

Теперь давайте примем во внимание следующие представления:

public class Views {

    public static class Foo {}

    public static class Bar {}
}

И давайте применим представления к полям класса Example:

@Data
public class Example {

    @JsonView(Views.Foo.class)
    private int a = 1;

    @JsonView(Views.Bar.class)
    private int b = 2;

    private int c = 3;
}

И давайте сериализуем экземпляр Example, используя Foo view:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithView(Views.Foo.class).writeValueAsString(new Example());

Он выдаст следующий JSON:

{"a":1,"c":3}

Теперь давайте отключим представление по умолчанию, включив его снова в сериализацию:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
String json = mapper.writerWithView(Views.Foo.class).writeValueAsString(new Example());

Он выдаст следующий JSON:

{"a":1}

Пример 3

Теперь давайте используем следующую конфигурацию представления в классе Example:

@Data
@JsonView(Views.Foo.class)
public static class Example {

    private int a = 1;

    @JsonView(Views.Bar.class)
    private int b = 2;

    private int c = 3;
}

И давайте сериализуем экземпляр Example, используя Foo view:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithView(Views.Foo.class).writeValueAsString(new Example());

Он выдаст следующий JSON:

{"a":1,"c":3}

Теперь давайте сериализуем экземпляр Example, используя Bar представление:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithView(Views.Bar.class).writeValueAsString(new Example());

Он выдаст следующий JSON:

{"b":2}
...