gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:38:28 25 4
gpt4 key购买 nike

是否可以动态设置或在调用时设置所需的@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
}
}

最佳答案

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

有一个 mixin 类来标记你的 foo作为被忽略的属性之一。在您的主类中标记所需的两个 fiend,只要这是一个选项字段,您就可以注入(inject)此 mixin。

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

}

您可以按如下方式将 mixin 配置到映射器中。

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

每当您从第三方 API 获得此响应时,这并不总是一个可行的选项,您可能会使用第三方 API 提供的默认 Jackson 映射器(如 Resttemplate)进行序列化/反序列化。

在这种情况下,而不是 foo属性,您可以只包含所有响应中存在的任何属性,并使用 @JsonAnyGetter 处理其余属性。和@JsonAnySetter 。您可以在 map 中捕获它,其中键是您的对象名称,在本例中为 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);
}

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

关于java - JsonProperty 所需值可以是有条件的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com