2017-02-24 56 views
1

@JsonPropertyを動的に設定したり、呼び出し時に設定することは可能ですか?JsonPropertyの必須値を条件付きにすることはできますか?

この背後にある理由... 私は、スキーマを記述し、

  • 必要とされている何新しい項目
  • のために必要なフィールドがどのようなものを定義するJSONファイルを生成しています更新を項目に追加します。

ので、作成が唯一のfoo

を必要とし、更新は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というように、ミックスインを使うことができます。

あなたのfooを無視されたプロパティの1つとしてマークするmixinクラスがあります。あなたのメインクラスでは両方のフィーンドが必要です。これがオプションフィールドである場合はいつでもこのミックスインを注入できます。

@JsonIgnoreProperties("foo") 
public abstract class mixinClass { 

} 

次のように、ミキサーをマッパーに設定します。

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixInAnnotations(Bean.class, mixinClass.class); 

あなたはResttemplateのようにそれらによって提供されているデフォルト・ジャクソンマッパーを使用して/デシリアライズをシリアライズされるかもしれないサードパーティのAPIからこの応答を取得している時はいつでもこれは常に働いてオプションではありません。

この場合、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

これを明確にしてください。私は、mixinClassを拡張するためにBeanクラスを使用するつもりですが、ObjectMapperコードはどこに置いていますか? – Elijah

+1

ObjectMapperはあなたのためのコンテンツをシリアライズ/デシリアライズしようとしているファイルとなります。それはPOJOにはありません。 – Coder

+0

「@JsonProperty(value = "foo"、required = false)」はデフォルトではfalseで、JsonIgnorePropertiesを使用すると、falseのままになり、私たちが持っているすべてのPOJOを変更する必要がありますそれらをtrueにして、値を変更するためにJsonIgnorePropertiesを使用します。これは?正確である...............そして、それがそうであるならば、我々はのPOJOの何百と欲望を持っているように、この問題にアプローチする方法については他の提案は行かなければならないことですそれらのすべてを変更してください。 – Elijah

1
あなたはミックスインwiht再生することができます

とマッパー:

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にインタフェースを実装させ、BeanクラスにObjectMapperコードを追加しますか? ObjectMapperコードのどこに行きたいのか、Beanクラスのデフォルトを変更できるようにするためにそれを適用する方法については明確ではありません。 – Elijah

関連する問題