2014-05-07 20 views
11

Ben gibi bir yapı içinde bazı istekleri yanıt veriyor konuşuyorum REST API:Belirli bir json alanını hangi değişkenle eşleştirmesi gerektiğini Retrofit'e bildirme?

'RESPONSE_DATA_NAME' veri "adı"
{ 
    "_links": { 
    "next": "NEXT_DATA_BLOCK_URL", 
    "prev": "PREV_DATA_BLOCK_URL", 
    "self": "CURRENT_DATA_BLOCK_URL" 
    }, 
    "RESPONSE_DATA_NAME": [ 
    { 
     ... DATA_FIELDS ... 
    } 
    ] 
} 

- değişiklikler istenilen isteğine göre. örneğin, 'takımlar' veya 'mesajlar' olabilir.

public class PagedResponse<T> { 
    public PagingLinks _links; 
    public List<T> _data; 
} 

hep '_data' üyesine 'RESPONSE_DATA_NAME' harita edeceğiz böylece benim RestAdapter ayarlayabilirsiniz herhangi bir yolu yok, var mı:

Bu nedenle aşağıdaki üyeleri ile genel bir sınıf yarattı alan adının gerçekte ne olduğu

Teşekkür^_^

cevap

15

Eğer @SerializedName ile _data alanını açıklama olabilir GSON kullanma. Bu ek açıklamanın parametresi (değeri), nesneleri serileştirme ve serileştirme sırasında kullanılacak addır. Örneğin, Java alanı _ data, JSON'da RESPONSE_DATA_NAME olarak temsil edilir. Eğer özel de-seri hale yazmak zorunda ardından json alanını kontrol etmek istiyorsanız

public class PagedResponse<T> { 

    public PagingLinks _links; 
    @SerializedName(value="RESPONSE_DATA_NAME") 
    public List<T> _data; 
} 

Ayrıca doc


gördüğünüz gibi gibi nihayet

public class CustomDeserializer implements JsonDeserializer<PagedResponse> { 

    @Override 
    public PagedResponse deserialize(final JsonElement json, 
      final Type typeOfT, final JsonDeserializationContext context) 
      throws JsonParseException { 

     Gson gson = new Gson(); 
     PagedResponse pagedResponse = new PagedResponse<>(); 
     List list = new ArrayList<>(); 

     pagedResponse = gson.fromJson(json, PagedResponse.class); 

     Type listType = new TypeToken<List>() {}.getType(); 

     Set<Entry<String, JsonElement>> enteries = json.getAsJsonObject().entrySet(); 
     for (Entry<String, JsonElement> entry : enteries) { 
      JsonElement jsonElement = (JsonElement) entry.getValue(); 
      if (jsonElement.isJsonArray()) { 
       list.add(gson.fromJson(jsonElement, listType)); 
      } 
     } 
     pagedResponse.set_data(list); 
     return pagedResponse; 

    } 
} 

altına o

ayrıştırmak
GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(PagedResponse.class, new CustomDeserializer()); 
Gson gson = gsonBuilder.create(); 

gson.fromJson(Your_JSON_STRING_HERE, PagedResponse.class); 
+0

:

O

P de-serializer sınıf biraz aptal ama işe yarıyor = veya diğeri için 'mesajlar'. Bu nedenle bu benim sorunum için bir çözüm değil. Bu ek açıklamayı '_data' değişkeninde birden çok kez kullanabilseydim, başa çıkabilirdim, ama ne yazık ki mümkün değil ... başka önerileriniz var mı? =/ – iDaN5x

+0

daha sonra özel seri hale getirici ve de-serializer yazabilir, ellerinizde kontrol elde edersiniz –

+0

Biraz tembel olduğum için bunu önlemek isterdim ... Peki sanırım başka seçeneğim yok ... yine de teşekkürler! – iDaN5x

1

Yani Sonunda bir kostüm mevcut JsonObject için data alanı ekler de-seri hale, ve kopyalarını (a JsonArray olan) RESPONSE_DATA_NAME içeriği oluşturulan soruna bir çözüm ...

bulundu. Daha sonra GSON basit dönüşümü (gson.fromJson()) ile normal olarak serileştiriyorum. Sorun alanın adı bir istek için 'ekipler' olabilir (isteğine bağlı olarak değişiyor olduğu

public class PagedResponseDeserializer implements JsonDeserializer<PagedResponse> { 

    @Override 
    public PagedResponse deserialize(JsonElement json, Type typeOfT, 
      JsonDeserializationContext context) throws JsonParseException { 

     Gson gson = new Gson(); 
     JsonElement value = null; 
     JsonObject jsonObject = json.getAsJsonObject();  

     Iterable<Entry<String,JsonElement>> entries = jsonObject.entrySet(); 
     for (Entry<String, JsonElement> entry : entries) { 
      value = entry.getValue(); 
      if (value.isJsonArray()) break; 
     } 

     jsonObject.add("data", value); 

     return gson.fromJson(jsonObject, typeOfT);  
    } 
} 
İlgili konular