JsonProperty所需的值可以是有条件的吗?
是否有可能在调用时需要动态设置或设置@JsonProperty?JsonProperty所需的值可以是有条件的吗?
这背后的原因... 我生成JSON文件描述了一个模式,并定义
- 什么是一个新项目所需的字段
- 需要什么样的字段为更新到项目。
因此,创建仅需要富
和更新需要Foo和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
标记为忽略的属性之一。在你的主类中标记两个恶魔需要的,并且只要这是一个选项字段,你就可以注入这个混合。
@JsonIgnoreProperties("foo")
public abstract class mixinClass {
}
您将您的mixin配置到您的映射器中,如下所示。
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Bean.class, mixinClass.class);
这并不总是每当你都可以从第三方API,你可能会被序列化/使用它们由他们像Resttemplate提供的默认杰克逊反序列化映射此响应工作选项。
在这种情况下,您可以不包含foo
属性,而是包含所有响应中存在的任何属性,并使用@JsonAnyGetter
和@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);
}
让我知道你是否需要任何进一步的澄清!
澄清这一点。我将使用我的Bean类来扩展mixinClass,但是我在哪里放置ObjectMapper代码? – Elijah
ObjectMapper随文件将为您反序列化/序列化内容。它不在POJO中。 – Coder
在进一步阅读'@JsonProperty(value =“foo”,required = false)'时默认是false,并且通过使用JsonIgnoreProperties它将保持为false,然后我需要改变我们所有的POJO让它们为true,然后使用JsonIgnoreProperties来更改值。这是准确的吗?...............如果是这种情况,那么对于如何解决这个问题的任何其他建议,因为我们有数百个POJO和愿望是不必去改变他们所有。 – Elijah
可以室内用混入播放和映射器:
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);
但我强烈建议避免使用这种与杰克逊条件的限制,因为它不适合它,它看起来有点令人困惑。
与我在此袒露。那么,让Bean实现接口并将ObjectMapper代码添加到我的Bean类中?我不清楚ObjectMapper代码要去的地方,或者如何去应用它来改变Bean类的默认值。 – Elijah
你能否详细解释你的情况? – Coder
增加了更多细节。 – Elijah
是否用于序列化/反序列化?你看过自定义串行器吗?使用'@ JsonAnyGetter'和'@ JsonAnySetter'是一个可行的选择吗? – Coder