0

我正在开发一个公开 REST API 的 Spring Boot Web 应用程序,但我在 JSON 序列化方面遇到了问题。

假设我有两个类 A 和 B,它们是一对多的双向关系。

这意味着我有这样的事情:

public class A {
    private List<B> bList;
    ...
}

public class B {
    private A owner;
    ...
}

当涉及到 JSON 序列化这个时,当然有一个循环。

这是我的问题:

  • 在关注的 API 方法中A(例如“给我数据库中所有 As 的列表”),我想要一个 JSON 序列化,其中:
    • A对象确实包含Bs的列表
    • B对象不包含其 A 所有者
  • 在专注于B(例如“给我数据库中所有Bs 的列表”)的 API 方法中,我想要一个 JSON 序列化,其中:
    • A对象不包含其Bs的列表
    • B对象确实包含它们的A所有者

我相信我可以让它与@JsonView注释一起使用,但我认为这不是一个优雅的解决方案。在我的应用程序(有两个以上的类)中,我需要创建和管理至少 4 或 5 个 JsonView:所以在我的模型类中,对于每个属性,我都必须管理一堆乱七八糟的@JsonView注释。相反,我认为模型类不应该意识到它们具有不同的 JSON 表示,具体取决于 API 方法。

我搜索了如何使用自定义 JSON 序列化程序,发现 Jackson 允许使用其 SimpleModule 来做到这一点。然而,SimpleModule 似乎不允许根据具体情况选择使用哪个序列化器(它总是使用最后添加的序列化器)。

所以我现在有点不知所措。有人知道一种让控制器选择如何序列化类的干净方法吗?

4

3 回答 3

0

您可以将@JsonIdentityInfo注释与实体一起使用或使用@JsonManagedReference, @JsonBackReference

@JsonIgnore您甚至可以忽略与or的关系的一侧@JsonView

如果您想自己管理序列化/反序列化,请使用自定义实现(例如 with @JsonDeserialize)。

Eugen 提供了一个很好的教程

于 2018-10-16T09:33:13.620 回答
0

我认为你应该DTO在这里使用,你可以DTO为不同的端点使用不同的,你可以选择你想要包含或排除的字段。此外,如果需要,您可以装饰它们。

DTO在这里,您列出了在端点中使用的好处: REST API - DTO 与否?

于 2018-10-16T09:21:52.830 回答
0

利用@JsonIdentityInfo

你的问题在这里有答案:杰克逊 - 具有双向关系的实体序列化(避免循环)

于 2018-10-16T09:23:17.807 回答