类和字段级别的@JsonView批注和对象映射器

时间:2019-03-27 06:35:13

标签: java jackson jackson-databind json-view

我有viewsentity类别,如下所示:

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}),以便无论传递给Object Mapper的View类如何,输出响应中都具有诸如z, v之类的非注释字段?

我确实尝试研究有关使用类级别@JsonView批注的其他资源,但我找不到任何资源。有效果吗?如果是,请解释相同的内容。

1 个答案:

答案 0 :(得分:1)

  

我是否需要在类级别使用 ffmpeg -i movie.mov -vcodec copy -acodec copy out.mp4 ,以便与传递给{{1}的视图类无关,在输出响应中有诸如@JsonView({Views.ViewOne.class, Views.ViewTwo.class})z这样的非注释字段}?

在您的v实例中启用MapperFeature.DEFAULT_VIEW_INCLUSION时,您将不需要它。默认情况下启用了此功能。您可能以某种方式禁用了它吗?

这是文档中的引言:

  

确定JSON序列化视图中是否包含不包含视图批注的属性的功能(有关JSON视图的更多详细信息,请参见@JsonView)。如果启用,将包括非注释属性;禁用时,它们将被排除。


示例1

让我们考虑以下ObjectMapper类:

ObjectMapper

让我们使用以下命令将Example的实例序列化为JSON:

@Data
public class Example {

    private int a = 1;

    private int b = 2;

    private int c = 3;
}

它将产生以下JSON:

Example

示例2

现在让我们考虑以下观点:

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

让我们将视图应用于{"a":1,"b":2,"c":3} 类的字段:

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

它将产生以下JSON:

Foo

现在让我们禁用默认视图,并再次对其进行序列化:

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

它将产生以下JSON:

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

示例3

现在让我们在ObjectMapper mapper = new ObjectMapper(); mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); String json = mapper.writerWithView(Views.Foo.class).writeValueAsString(new Example()); 类中使用以下视图配置:

{"a":1}

让我们使用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

它将产生以下JSON:

Foo

现在,让我们使用ObjectMapper mapper = new ObjectMapper(); String json = mapper.writerWithView(Views.Foo.class).writeValueAsString(new Example()); 视图序列化{"a":1,"c":3} 的实例:

Example

它将产生以下JSON:

Bar