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