我有一个班级订单:
@Data
@Entity
public class Order {
private List<Project> projects;
// more fields
}
我的控制器中有两个API方法:
@GetMapping
public ResponseEntity<List<Order>> getOrders() {
return ResponseEntity.ok(orderService.getOrders());
}
@GetMapping("/{id}")
public ResponseEntity<Order> getOrder(@PathVariable long id) {
return ResponseEntity.ok(orderService.getOrder(id));
}
因此,在这种情况下projects
,总是通过JSON发送,如果它的存在只是被序列化,如果它不存在则被延迟获取然后序列化。我可以通过用注释字段来避免将其序列化@JsonIgnore
。但问题是我想有时甚至不发送它。例如在getOrders()
我不希望projects
被序列化。在getOrder(...)
我想projects
被序列化。有什么方法可以在运行时在自定义代码中或通过注释告诉我我想在一种特定情况下而不是另一种情况下发送它吗?我唯一想到的是-在序列化之前-我可以projects
使用null 初始化并使用注释实体@JsonInclude(JsonInclude.Include.NON_NULL)
。这样就不会发送它,如果我想发送它,我可以避免用null初始化它。但是很显然,我不想遍历Order
O(n)中的每个对象只是为了将其初始化projects
为null。
使用“ JSON视图”很容易实现。
首先,定义一些类来表示每个视图(例如内部/外部):
public class OrderViews {
public static class OnlySomeFields {}
public static class AllFields extends OnlySomeFields {}
}
接下来,在您的课程中,为每个字段分配一个视图:
public class Order {
@JsonView(OrderViews.OnlySomeFields.class)
private String foo;
@JsonView(OrderViews.AllFields.class)
private String bar;
// getters/setters/etc
}
然后,在控制器中,您可以指定每种方法要使用的视图:
@RestController
public class MyController {
@JsonView(OrderViews.AllFields.class)
@GetMapping("/with-all-fields")
public Order getOrderAllFields() {
return orderService.getOrder();
}
@JsonView(OrderViews.OnlySomeFields.class)
@GetMapping("/with-some-fields")
public Order getOrderAllFields() {
return orderService.getOrder();
}
}
采用这种设置,导航到/with-all-fields
一个JSON含有回报foo
和bar
,而导航到/with-some-fields
返回一个JSON仅含有foo
。
您可以使用此技术来选择性地序列化特定字段,并且应该能够将其应用于您的用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句