2016-04-05 15 views
0

私はGsonを使用してJSON(jqueryクエリービルダーで生成)を対応するJavaオブジェクトに解析しています。私の問題は、属性「値」は、配列または単一の値のいずれかにできることである。Gson:オプションのリストを扱う

{ 
    "condition": "AND", 
    "rules": [ 
    { 
     "id": "date", 
     "field": "date", 
     "type": "date", 
     "input": "text", 
     "operator": "between", 
     "value": [ 
     "01.01.2016", 
     "20.01.2016" 
     ] 
    } 
    ] 
} 

または

{ 
    "condition": "AND", 
    "rules": [ 
    { 
     "id": "date", 
     "field": "date", 
     "type": "date", 
     "input": "text", 
     "operator": "equal", 
     "value": "01.01.2016" 
    } 
    ] 
} 

私のクラスには、フィールドを持っている場合はどうやらGsonは最初のJSONのオブジェクトを構築することができますprivate String[] valueのように、2番目のフィールドにはprivate String valueのようなフィールドがありますが、両方のJavaフィールドオプションを持つJSON入力ではありません。

私の質問:単一の「値」または「値」の配列の両方を扱う方法ですか?

+0

おそらくもっと簡単なjsonを編集するオプションがある場合は、私はそれが常に配列を含むようにJSONを変更します。 – bhspencer

答えて

0

私はあなたがこのJSONをデシリアライズするために使用しているクラスの構造が何であるかを知らないが、私はあなたが見ることができるように、この

public class Rule { 

    private String id; 
    private String field; 
    private String type; 
    private String input; 
    private String operator; 
    private List<String> value; 

    // constructors, getters and setters 
} 

のようなクラスがあることをsugestしたいのですがvalueプロパティは、java.lang.Stringオブジェクトのリストとして定義されます。この方法は、両方のケースを処理するのに役立ちます。valueが配列の場合と、単純な文字列値の場合です。

私たちはGsonと何ができますか?私たちは、あなたが

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Rule.class, new CustomSerializer()) 
     .create(); 

とデシリアライザを登録する必要があります。その後、この

public class CustomSerializer implements JsonDeserializer<Rule> { 
    public Rule deserialize(JsonElement jsonElement, Type type, 
          JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 

     JsonObject obj = (JsonObject) jsonElement; 
     JsonElement value = obj.get("value"); 
     List<String> values = new ArrayList(); 
     if (value.isJsonArray()) { 

      for (JsonElement jsonElement1 : value.getAsJsonArray()) { 
       String str = jsonElement1.getAsString(); 
       values.add(str); 
      } 
     } else { 
      values.add(value.getAsString()); 
     } 
     // deserialize other properties 


     Rule rule = new Rule(); 
     rule.setValue(values); 
     // set other properties 
     return rule; 
    } 
} 

のようなカスタムデシリアライザを作成することができますし、あなたの全体の一部である

{ 
    "id": "date", 
    "field": "date", 
    "type": "date", 
    "input": "text", 
    "operator": "equal", 
    "value": "01.01.2016" 
} 

のようなJSONオブジェクトをデシリアライズすることができますデータ構造。

関連する問題