2016-04-05 19 views
0

JSON'u (jquery query oluşturucu tarafından oluşturulan) karşılık gelen bir Java Nesnesine ayrıştırmak için Gson kullanıyorum. Sorunum niteliği "değer" bir dizi veya tek bir değer olabilir olmasıdır:Gson: isteğe bağlı bir Listeyi kullanma

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

veya

{ 
    "condition": "AND", 
    "rules": [ 
    { 
     "id": "date", 
     "field": "date", 
     "type": "date", 
     "input": "text", 
     "operator": "equal", 
     "value": "01.01.2016" 
    } 
    ] 
} 
benim sınıf bir alan varsa

Görünüşe GSON ilk JSON için nesneyi inşa edebilirsiniz private String[] value gibi ve ikincisi için private String value gibi bir alan - ama her ikisi de Java alan seçeneğiyle JSON girişlerini değil.

Soru sorum: Hem tek bir "değer", hem de "değerler" dizisini ele almanın bir yolu mu?

+0

Muhtemelen daha kolay olacak jsonu düzenleme seçeneğiniz varsa. Json'u her zaman bir dizi içerecek şekilde değiştiririm. – bhspencer

cevap

0

Sana bu JSON serisini kullanan bir sınıfın yapısının ne olduğunu bilmiyorum, ama ben Gördüğünüz gibi bu

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 
} 

gibi bir sınıf olduğunu sugest istiyorum value özelliği, java.lang.String nesnelerinin bir listesi olarak tanımlanır. Bu yaklaşım, her iki durumu da ele almamıza yardımcı olacaktır: value bir dizidir ve basit bir dize değeri olduğunda.

Gson ile neler yapabiliriz? Size

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

ile deserializer kaydetmeniz gerekir Bundan sonra bu

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

gibi özel deserializer oluşturabilir ve size bütünün bir parçasıdır

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

gibi JSON nesnesi serisini veri yapısı.