@JsonView 注释如何用于嵌套实体?

oko*_*oko 4 java json jax-rs jackson dropwizard

我正在尝试对我的嵌套实体使用 @JsonView 注释。为了更清楚,假设我们有 2 个实体,每个实体都有自己的视图类。

public class JsonViewAddress {
     //some view classes
}


public class Address {
   //fields annotated by JsonViewAddress's classes and @JsonProperty
}

public class JsonViewPerson {
  //some view classes
}

public class Person {

 //some fields (yes annotated with JsonViewPerson classes and @JsonProperty)

 //also assume that this is annotated with any JsonViewPerson's class.
 private Address address;

}
Run Code Online (Sandbox Code Playgroud)

让我们尝试从响应中使用 Json 类型实现这个 Person 类

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(value = { /* WHAT SHOULD BE WRITTEN HERE ? */ })
   public Response method() {
       //return Person entity in response
   }
}
Run Code Online (Sandbox Code Playgroud)

@JsonView 注释采用 String 数组,但是我应该如何确定这些编写的视图类必须为它们所属的每个实体显式工作?我想很快看到 UserView 适用于 User,AddressView 适用于 Address。

谢谢。

Pan*_*boy 6

我有一个类似的问题,这不完全是你的问题,但也许这种方法对你有用。

我只使用一个 ViewObject

public class Views {

    public static class Low {
    }

    public static class Medium extends Low {
    }

    public static class High extends Medium {
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我有一个嵌套对象时,我都需要在 Views.Low 视图中使用它,所以我编写了一个序列化程序来执行此操作。

public class Serializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.writerWithView(Views.Low.class).writeValue(jgen, value);
    }
} 
Run Code Online (Sandbox Code Playgroud)

最后在我的对象中我是这样使用的:

public class Person {

   @JsonView(Views.High.class)
   @JsonSerialize(using = Serializer.class)
   private Address address;

}
Run Code Online (Sandbox Code Playgroud)

资源:

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(Views.High.class)
   public Response method() {
       //return Person entity in response with address low view
   }

   @GET
   @Path("/stack/overflow")
   @JsonView(Views.Medium.class)
   public Response method() {
       //return Person entity in response with no address
   }

}
Run Code Online (Sandbox Code Playgroud)

您可以使用这种方法解决您的问题,但是如果您使用不同的类视图,则必须编写大量序列化程序。