JsonProperty 所需的值可以是有条件的吗?

Can the JsonProperty required value be conditional?

是否可以动态设置或调用时设置所需的@JsonProperty?

这背后的原因... 我正在生成 json 个描述架构并定义

的文件

因此,创建只需要 foo

更新需要 foo 和 bar

我可以做一些事情,这样我就可以传递一些东西来表达 bar 现在是必需的吗?

或者我是否需要复制此代码以便对 JsonProperty 进行不同的设置?

@JsonInclude(Include.NON_NULL)

public class Bean {

    @JsonProperty(value="foo", required=false)
    private FooProperty fooProperty;

    @JsonProperty(value="bar", required=false)
    private BarProperty barProperty;

    //
    public FooProperty getFooProperty() { return fooProperty; }

    public void setFooProperty(FooProperty argFooProperty) {
        this.fooProperty = argFooProperty
    }


    public BarProperty getBarProperty() { return barProperty; }

    public void setFooProperty(BarProperty argBarProperty) {
        this.barProperty = argBarProperty
    }
}

您可以使用 Mixins 和映射器:

public interface BarRequiredMixIn {
    @JsonProperty(value="bar", required=true)
    private BarProperty barProperty;
}

ObjectMapper mapper = new ObjectMapper();
// When you want that it is required
mapper.addMixInAnnotations(Bean.class, BarRequiredMixIn.class);

但我强烈建议避免对 Jackson 使用这种条件限制,因为它不是为此而设计的,而且看起来有点混乱。

您可以通过多种方式解决此问题。第一个是 Franjavi 建议你可以使用 mixin。

有一个 mixin class,它将把你的 foo 标记为被忽略的属性之一。在你的 main class 中标记两个所需的 fiends 并且只要这是一个选项字段你就可以注入这个 mixin。

@JsonIgnoreProperties("foo")
public abstract class mixinClass {

}

您将您的 mixin 配置到您的映射器中,如下所示。

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Bean.class, mixinClass.class);

当您从第三方 API 获得此响应时,您可能 serializing/deserializing 使用由他们提供的默认 jackson 映射器(如 Resttemplate),这并不总是一个有效的选项。

在这种情况下,不用 foo 属性,您可以只包含所有响应中存在的任何属性,并使用 [=16= 处理其余属性] 和 @JsonAnySetter。您可以在地图中捕获此内容,键是您的对象名称,在本例中为 foo。您需要在父节点或封装这些可选属性的任何节点中包含以下部分。

@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

如果您需要进一步说明,请告诉我!!

根据您给出的示例,在您的 POJO 中设置以下内容就足够了,杰克逊将能够确定是否反序列化 it/not 。默认情况下所有@JsonProperty 都是必需的,因此使用下面的代码,您将能够根据请求

中的负载在Create/Update 场景中实现可选的栏值
@JsonProperty(value="bar", required=false)
private Bar bar;