是否可以在调用时动态设置或设置@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
}
}
答案 0 :(得分:1)
你可以玩Mixins和mapper:
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使用这种条件限制,因为它不是为它设计的,而且看起来有点令人困惑。
答案 1 :(得分:1)
您可以通过多种方式解决此问题。第一个是Franjavi
建议您可以使用mixin。
有一个mixin类,它会将您的foo
标记为被忽略的属性之一。在你的主类中标记所需的恶魔,只要这是一个选项字段,你就可以注入这个混合。
@JsonIgnoreProperties("foo")
public abstract class mixinClass {
}
您可以将mixin配置到映射器中,如下所示。
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Bean.class, mixinClass.class);
当您从第三方API获得此响应时,这并不总是一个可行的选项,您可能正在使用默认的jackson映射器(如Resttemplate)提供序列化/反序列化。
在这种情况下,您可以只包含所有响应中存在的所有属性,并使用foo
和{{1}处理其余属性,而不是使用@JsonAnyGetter
属性。 }。您可以在地图中捕获此数据,其中键是您的对象名称,在本例中为@JsonAnySetter
。您需要在父节点或将封装这些可选属性的任何节点中包含以下部分。
foo
如果您需要进一步澄清,请与我们联系!!