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

时间:2017-02-24 15:35:31

标签: java json fasterxml

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

2 个答案:

答案 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

如果您需要进一步澄清,请与我们联系!!