使用枚举类型做为 javabean
接口返回的 json 中状态一般是 Int 类型的,如果不使用枚举则在代码中不知道这个 Int 是什么具体类型,使用枚举也不会耗费多少性能。
1. json 格式
{
"box":{
"name":"hat",
"price":200,
status : 2
}
}
2. 枚举变量
enum class BoxStatusType(val status: Int) {
S_NEW(0),
S_SHOW(1),
S_ACTIVE(2),
S_END(3);
companion object {
fun buildStatus(s: Int): BoxStatusType? {
for (status in BoxStatusType.values()) {
if (s == status.status) {
return status
}
}
return null
}
}
}
3. javaBean
open class Box {
var name: String = ""
var price: Int = 0
var status: BoxStatusType? = null
}
4. 自定义 JsonSerializer
class BoxStatusTypeSerializer : JsonSerializer, JsonDeserializer {
override fun serialize(src: BoxStatusType?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
return JsonPrimitive(src?.status)
}
override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): BoxStatusType? {
return BoxStatusType.buildStatus(json?.asInt)
}
}
5. 注册自定义的 JsonSerializer
private static Retrofit getRetrofitInstance() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(BoxStatusType.class, new BoxStatusTypeSerializer())
.create();
if (mRetrofit == null) {
synchronized (HTTPCenter.class) {
if (mRetrofit == null) {
mRetrofit = new Retrofit.Builder()
.baseUrl(HTTPService.Companion.getSERVICE_DEFAULT())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(initOkHttpClient()).build();
}
}
}
return mRetrofit;
}