Для этого вы можете попробовать использовать собственный десериализатор, который будет обрабатывать преобразование, как бы вы его ни настраивали.
Сначала вам понадобится класс для вашего внутреннего объекта, поскольку он многократно повторяется:
class Foo { //call this whatever you like
@SerializedName("Activity Date") // tell gson which Json field correspond to which class field
public String activityDate;
@SerializedName("Status")
public String status;
}
тогда ваша история отслеживания будет выглядеть следующим образом:
public class TrackingHistory {
public List<Foo> history;
public TrackingHistory(List<Foo> list) {
history = list;
}
}
и теперь вы можете создать класс десериализатора:
public class TrackingHistoryDeserializer implements JsonDeserializer<TrackingHistory> {
private Foo parseFoo(JsonElement element) { //this function tries to convert aJsonElement to a Foo class
if (element.isJsonObject()) {
JsonObject obj = element.getAsJsonObject();
return new Gson().fromJson(obj, Foo.class);
}
else
return null;
}
@Override
public Card deserialize(JsonElement paramJsonElement, Type paramType,
JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException {
List<Foo> history = new ArrayList<>();
// iterate through all objects contained in the json:
for (Map.Entry<String,JsonElement> entry : object.entrySet()) {
Foo foo = parseFoo(entry.getValue()); // parse the value associated to the current key
if (foo != null)
history.add(foo);
}
return new TrackingHistory(history);
}
}
и, наконец, вам нужнодобавьте десериализатор при создании службы модернизации:
Gson gson = new GsonBuilder().registerTypeAdapter(TrackingHistory.class, new TrackingHistoryDeserializer()).create();
YourRetrofitService service = new Retrofit.Builder().client(client)
.baseUrl(YOURENDPOINT)
.addConverterFactory(GsonConverterFactory.create(gson))
.addConverterFactory(ScalarsConverterFactory.create())
.build().create(YourRetrofitService.class);
, и тогда он будет работать всякий раз, когда вы объявляете что-то подобное:
@GET("url") // or POST or whatever needed
Call<TrackingHistory> getTrackingHistory();