package com.kelin.mvvmlight.zhihu.retrofit; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; /** * Created by dingzhihu on 15/5/7. */ public class ApiTypeAdapterFactory implements TypeAdapterFactory { private String dataElementName; public ApiTypeAdapterFactory(String dataElementName) { this.dataElementName = dataElementName; } @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); final TypeAdapter<JsonElement> elementTypeAdapter = gson.getAdapter(JsonElement.class); return new TypeAdapter<T>() { @Override public void write(JsonWriter out, T value) throws IOException { delegate.write(out, value); } @Override public T read(JsonReader in) throws IOException { JsonElement jsonElement = elementTypeAdapter.read(in); if (jsonElement.isJsonObject()) { JsonObject jsonObject = jsonElement.getAsJsonObject(); if (jsonObject.has("status")) { int status = jsonObject.get("status").getAsInt(); String message = jsonObject.get("message").getAsString(); if (status == 0) { //do nothing } else { throw new ApiException(status, message); } } if (jsonObject.has(dataElementName)) { jsonElement = jsonObject.get(dataElementName); } } return delegate.fromJsonTree(jsonElement); } }.nullSafe(); } }