如何配置 Jackson 和 Spring 以不同的方式呈现对象,具体取决于 URL 路径和嵌套级别



在我们的Spring应用程序中,我们使用Jackson来渲染控制器的JSON响应。

对于某些端点,我们希望调整渲染行为,只渲染某些对象的 id 字段。

我们有 3 种对象类型(OuterObject、ValueObject、InnerObject(。每个字段在其他字段旁边都有一个"id"字段。

JSON 对象的正常渲染:

{
"id": 1,
"name": "outerObject name",
"valueObject": {
"id": 11,
"name": "valueObject 11",
"innerObj": {
"id" : 111,
"name" : "innerObject 111"
}
}
}

JSON 对象的特殊呈现(跳过内部对象的"名称"字段(

{
"id": 1,
"namne": "obj name",
"valueObj": {
"id": 11,
"name": "valueObj 11",
"innerObj": {
"id" : 111         
}
}
}

如您所见,我们只想渲染某些对象的 id,但前提是它们是嵌套的。因此,在示例中,我们只想呈现内部对象的 id 字段。

但是,如果另一个端点将返回内部对象,那么我们希望渲染整个对象。

我看到杰克逊提供了许多注释来控制字段渲染方式的行为。但据我所知,他们都在强迫一种我们不想要的静态行为。

因为我们有很多这样的记录(大约 400 条(,所以我们不想为每个只包含 id 字段的对象创建第二个变体。我们的方法是重用当前逻辑来构建和填充这些对象,并在将对象序列化为 JSON 字符串时丢弃某些字段。

更新

我不认为@JsonView注释可以解决这个问题,因为一次只能使用一个视图来呈现响应。

也许我没有100%明确要求。

外部对象类型和内部对象类型只是示例。我们有几种这样的类型(超过 400 种(,它们可以以不同的组合嵌套。内部对象并不总是嵌套在外部对象中。InnerObject 也可以是不同终结点的另一个响应的根,或者嵌套在 OuterObject 以外的另一个对象中。

由于这个要求,我不明白如何使用@JsonView注释来解决这个问题。我将如何定义外部对象和内部对象类型可以是根对象或嵌套对象的情况的视图。我想我最终会为每个根到嵌套的对象组合创建一个视图。拥有超过400个这样的对象,这可能会在复杂性上爆炸式增长。

您可以将 Jackson 库@JsonView与 Spring 一起使用,并在端点/方法级别进行自定义序列化。

一些例子可以在这里找到

最新更新