2016-08-18 14 views
0

私はPlay Framework 2.5(Java)とフォームデータバインディング(Spring Frameworkから)を使用してREST Webサービスを開発しています。 私はこのAPIにかなり慣れており、検証制約(例:必須)を正式化する方法と同様に、BodyParser APIの使用を避けたいと考えています。プレイフレームワークのタイプ選択JSONフォーム

は、私がこのようなJSON要求を解析する必要があります:文字列(Javaでjava.lang.Stringで)と、文字列の配列:

{ 
    "elements": [ 
     { 
      "val": "1" 
     }, 
     { 
      "val": ["1","2","3"] 
     } 
    ] 
} 

問題は「valが」二つの異なるタイプを受け入れるということです(私のコードではjava.util.List)。

JavaコードでこのようなJSONフォームを "形式的に"モデル化できますか? "val"属性に異なるタイプの2つの異なるサブクラスによって実装された抽象クラス(generic)を使用しようとしましたが、Springがオブジェクトのインスタンス化に失敗しました(BeanInstantiationException)。ここで

は、現在のデータモデルである:

public class Foo { 

    @Constraints.Required 
    public List<Fii> elements; 

} 

public class Fii { 

    @Constraints.Required 
    // Which type ? Object ? 
    public ? val; 

} 

答えて

3
public class Response 
{ 
    List<ResponseEntry> response; 
    /*getters + setters */ 

    public static class ResponseEntry 
    { 
     private List<Value> elements; 
     /*setters + getters*/ 

     public static class Value 
     { 
      private List<Object> val; 
     } 
    } 
} 

残念ながら、あなたが扱っているJSONの構造と、それをデシリアライズする唯一の方法は、value属性の型がObjectであることです。ただし、JSONをデシリアライズすると、値がオブジェクトであるか単一の値であるかを簡単に把握できます。

JSONは、オブジェクト(Javaでのマップ)、配列、文​​字列、数値およびブールの5つのデータ型のみをサポートしています。あなたの場合のように見えますが、値は数字または数字のマップのいずれかになりそうです。あなたは2つの可能性を確認する必要があります。クイックインスタンス比較を使用すると、どのタイプの値であるかを把握できるはずです。

ObjectMapper mapper = new ObjectMapper(); 
Response r = mapper.readValues(json, Response.class); 
Value val = r.response.get(0).values.get(0); 
if (val.value instanceof Map) 
    ; // multiple 
else 
    ; // single 
+0

ありがとうございました。私はデータマッパーがJavaの型だけを見ていると思っていたので、Java Object型がJSON構造体に適応するかどうかはわかりませんでした。私は実際に、各Valueクラスをinstanceofテストによって特定のクラスに変換することができます。 –

+0

@Alexandre LEBRUN私の答えがあなたを助けたことを聞いてよかった! –