При использовании дооснащения для получения json с удаленного компьютера и его разбора в pojo, и json имеет «тип» в каждом элементе, в зависимости от типа будут созданы различные классы pojo.
{
"result": [
{
"type": "stroy",
"stroy_data_1": xxx,
"story_data_2": yyy
},
{
"type": "detail",
"detail_data_1": 111,
"detail_data_2": 222
}
]
}
с retofit, это может быть сделано с помощью addConverterFactory
с Converter.Factory
, например: здесь с RuntimeTypeAdapterFactory
он создает dataAdapter
для создания Gson и просит создать calsses на основе "type"
fun createCustomeDataGson(): Gson {
val dataAdapter = RuntimeTypeAdapterFactory
.of(TopLevelItem::class.java, "type")
.registerSubtype(Story::class.java, "story")
.registerSubtype(Detail::class.java, "detail")
return GsonBuilder()
.registerTypeAdapterFactory(dataAdapter)
.create()
}
с помощью Gson a Converter. Фабрика создана для модернизации до addConverterFactory
fun getGsonConverterFactory(): Converter.Factory {
return GsonConverterFactory.create(createCustomeDataGson())
}
fun <T> createRetrofitService(clazz: Class<T>,
baseUrl: String,
okHttpClient: OkHttpClient): T {
val restAdapter = Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(getGsonConverterFactory())
.build()
return restAdapter.create(clazz)
}
, наконец, услуга модернизации модифицирована:
fun createCustomeDataApiApi(): CustomeDataApi {
val baseUrl = getBaseUrl(defaultBaseUrl)
return createRetrofitService(CustomeDataApi::class.java, baseUrl, okHttpClient)
}
internal interface CustomeDataApi {
@GET("/api/customedata")
fun getCustomData(@QueryMap params: Map<String, String>?): Call<DataResponse>
}
Она работает таким образом.Но есть варианты использования, не использующие retorfit и имеющие только строку json, и хотели бы использовать gson.fromJson<T>(jsonString, dataClassType)
, как настроить gson для генерации класса по типу в json?