【发布时间】:2019-04-02 23:48:09
【问题描述】:
当使用改造从远程获取 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 并要求根据“类型”创建类
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 创建一个 Converter.Factory 以改造为 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中的“类型”生成类?
【问题讨论】:
标签: gson runtimetypeadapterfactory