与POJO + Jackson具有相同名称和不同类型的anyOf字段的Json模式

问题描述

如果具有组件A的架构包含包含两个项目的AnyOf节。它们之间的区别是,在一种情况下,子组件C是数组,而在另一个C中,子组件C是对象,但是它们具有相同的名称B。如果我有两个Java对象,可以用jackson处理它吗?

我在考虑是否可以在带有一些注释的界面上使用,杰克逊将确定正确的对象...

"A": {
        "type": "object","anyOf": [
          {
            "properties": {
              "B": {
                "type": "array","items": {
                  "type": "object","$ref": "#/components/schemas/C"
                }
              }
            },"additionalProperties": false
          },{
            "properties": {
              
              "B": {
                "type": "object","$ref": "#/components/schemas/C"
              }
            },"additionalProperties": false
          }
        ]
      }

假设我在Java中有这个

public class AAnyOf1 {

  @JsonProperty("B")
  private List<C> b = new ArrayList<>();

...

}

public class AAnyOf2 {

  @JsonProperty("B")
  private C b = null;

...

}

解决方法

在发送JSON Object而不是JSON Array和一个JSON Object的情况下,这是一种非常流行的模式。因此,代替:

{
  "b": [
    {
      "id": 1
    }
  ]
}

API响应如下:

{
  "b": {
      "id": 1
    }
}

Jackson已处理此用例。您需要启用ACCEPT_SINGLE_VALUE_AS_ARRAY功能,并且只需要一个POJO版本:

class AAnyOf {

  @JsonProperty("B")
  private List<C> b;

...

}