2017-02-24 117 views
1

是否有可能在调用时需要动态设置或设置@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 
    } 
} 
+0

你能否详细解释你的情况? – Coder

+0

增加了更多细节。 – Elijah

+0

是否用于序列化/反序列化?你看过自定义串行器吗?使用'@ JsonAnyGetter'和'@ JsonAnySetter'是一个可行的选择吗? – Coder

回答

1

你可以用几种方法解决这个问题。第一个是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); 
} 

让我知道你是否需要任何进一步的澄清!

+0

澄清这一点。我将使用我的Bean类来扩展mixinClass,但是我在哪里放置ObjectMapper代码? – Elijah

+1

ObjectMapper随文件将为您反序列化/序列化内容。它不在POJO中。 – Coder

+0

在进一步阅读'@JsonProperty(value =“foo”,required = false)'时默认是false,并且通过使用JsonIgnoreProperties它将保持为false,然后我需要改变我们所有的POJO让它们为true,然后使用JsonIgnoreProperties来更改值。这是准确的吗?...............如果是这种情况,那么对于如何解决这个问题的任何其他建议,因为我们有数百个POJO和愿望是不必去改变他们所有。 – Elijah

1

可以室内用混入播放和映射器:

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); 

但我强烈建议避免使用这种与杰克逊条件的限制,因为它不适合它,它看起来有点令人困惑。

+0

与我在此袒露。那么,让Bean实现接口并将ObjectMapper代码添加到我的Bean类中?我不清楚ObjectMapper代码要去的地方,或者如何去应用它来改变Bean类的默认值。 – Elijah

相关问题