2016-03-28 23 views
0

JSON kullanarak bir API ile iletişim kuran bir proje üzerinde çalışıyorum. Bu benim JSON'taki ilk denemem ve birkaç yıldan beri java'dan uzaktayım, lütfen benimle birlikte ol.GSON kullanarak JSON API yanıtlarını işlemenin en iyi yolu nedir?

dize 1:

[{ 
    "apicall2": 
    [{ 
     "thatField":"thatFieldData", 
     "someFieldsAreTheSame":"someFieldsAreTheSameData", 
     "otherFieldsAreNotTheSame":"otherFieldsAreNotTheSame" 
    }] 
}] 

Benim veri örnekten de görebileceğiniz gibi, API: 2

[{ 
    "apicall1": 
    [{ 
     "thisField":"thisFieldData", 
     "thatField":"thatFieldData", 
     "anotherField":"anotherFieldData" 
    }] 
}] 

Dize İşte

verilerin nasıl göründüğünü bir fikirdir kullanılan api'yi içeren bir JSON dizesini döndürür. İçindeki veriler verileri içerir. API'ların ortak birçok veri alanı var, ancak bunların ötesinde alakasızlar.

DÜZENLEME: Kullanılması gereken bu API türlerinin düzinelerce vardır.

Yapmaya çalıştığım şey, tüm JSON dizelerini kabul eden ve uygun verileri içeren bir nesne döndüren bir yanıt sınıfı oluşturmaktır. Örnek için

: Kayboldum nerede

Gson gson = new Gson(); //Custom TypeAdapter goes here if needed. 
Response apicall2 = gson.fromJson(apicall2String, Response.class); 

System.out.println(apicall2.thatField);    //Prints thatFieldData 
System.out.println(apicall2.someFieldsAreTheSame);  //Prints someFieldsAreTheSameData 
System.out.println(apicall2.otherFieldsAreNotTheSame); //Prints otherFieldsAreNotTheSameData 

budur. İşte şimdiye kadar sahip olduğum şey. Burada bir TypeAdapter kullanmam gerektiğini düşünüyorum ama bunu benim durumuma nasıl uygulayacağımı anlayamadım.

public class Response { //Change to TypeAdapter possibly? 
} 
public class apicall1 { 
     String thisField; 
     String thatField; 
     String anotherField; 
} 
public class apicall2 { 
     String thatField; 
     String someFieldsAreTheSame; 
     String otherFieldsAreNotTheSame; 
} 
+0

. http://www.jsonschema2pojo.org/ –

+0

Bu konu sınıfların yapılması o kadar da değil. JSON'dan bu sınıflara ve geri dönüşe geçişi yönetmenin en iyi yolunu bulmaktır. İlginç site hiç yok. – lumberajackshaw

cevap

0

Sen nesnesine json serisini GSON en TypeToken sınıfını kullanabilirsiniz.

JSON:

[{ "apicall1": 
    [{ 
     "thisField":"thisFieldData", 
     "thatField":"thatFieldData", 
     "anotherField":"anotherFieldData" 
    }] 
}] 

Modeli:

class Response{ 

    private List<Result> apicall1; 

    class Result{ 
     private String thisField; 
     private String thatField; 
     private String anotherField; 
     public String getThisField() { 
      return thisField; 
     } 
     public void setThisField(String thisField) { 
      this.thisField = thisField; 
     } 
     public String getThatField() { 
      return thatField; 
     } 
     public void setThatField(String thatField) { 
      this.thatField = thatField; 
     } 
     public String getAnotherField() { 
      return anotherField; 
     } 
     public void setAnotherField(String anotherField) { 
      this.anotherField = anotherField; 
     } 
    } 

    public List<Result> getApicall1() { 
     return apicall1; 
    } 

    public void setApicall1(List<Result> apicall1) { 
     this.apicall1 = apicall1; 
    } 
} 

Dönüştürücü: w eğer

public static void main(String[] args) { 
    String response = "[{ \"apicall1\":  [{  \"thisField\":\"thisFieldData\",  \"thatField\":\"thatFieldData\",  \"anotherField\":\"anotherFieldData\"  }]}]"; 
    Gson gson = new Gson(); 
    List<Response> responses = gson.fromJson(response, new TypeToken<List<Response>>(){}.getType()); 
    System.out.println(responses.get(0).getApicall1().get(0).getThisField()); 
} 
+0

Kafamı cevabın etrafına sarmak için uğraşıyorum, ama TypeToken ile bir şeylerin olabileceğini düşünüyorum. Bu bir TypeAdapterFactory ile aynı kavram mı? – lumberajackshaw

+0

Evet, benzer bir kavram. TypeToken, genel türleri sınıf türleri olarak geçirmenizi sağlar. –

+0

Bir süre bunun üzerine çiğnedikten sonra, TypeAdapterFactory'ye doğru ilerlemekten daha iyi olduğumu düşünüyorum. Çözümünüz benim örneğimle çalışıyor, ancak tüm sınıflar yanıt sınıfının içinde yer alıyorsa, proje büyüdükçe kendimi kutlayacağım. – lumberajackshaw

0

bilmiyorum Aşağıda bir örnek Her iki adaptör de bir sınıfta ant. En iyi OOP tasarımı olmayabilir.

bunu başarmak için bu kadar böyle bir şey yapmak gerekir: Eğer JSON'dan Java sınıfları yapmak için bu siteyi kullanabilirsiniz

public class DoublyTypeAdapter implements JsonDeserializer<ApiCallTypeParent> 
{ 
    Gson gson = new Gson(); 

    @Override 
    public ApiCallTypeParent deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) 
      throws JsonParseException { 
     JsonObject json = jsonElement.getAsJsonObject(); 

     ApiCallTypeParent desrializeIntoMe; 
     // Detect which type to implement 
     if(apiTypeOne(type) { 
       desrializeIntoMe = new TypeOne(); 
     } else { 
       desrializeIntoMe = new TypeTwo(); 
     } 

     for (Map.Entry<String, JsonElement> entry : json.entrySet()) 
     { 
      switch(entry.getKey()){ 
      case "thisField": 
       desrializeIntoMe.setThisField(entry.getValue().getAsString()); 
       break; 
      ......  
      default: // We don't care 
       break; 
      } 
     } 

     return desrializeIntoMe ; 
     } 
} 
+0

"En iyi OOP tasarımı olmayabilir." Muhtemelen haklısın. – lumberajackshaw

+0

Gönderide düzinelerce API ile ilgileneceğimden bahsetmeyi unuttum (düzenleme geliyor). İfadelerin en iyi yaklaşım olması için bir ip olduğuna emin değilim. – lumberajackshaw

+0

Kesinlikle. Diğer cevabın çok büyük bir hayranı. – TheNorthWes

İlgili konular