首页 > 解决方案 > 带可选 Gson 转换器的改造客户端

问题描述

我有一些 API 客户端,我想传入一个可选的 Json 解码器。例如,某些 API 以以下方式返回 JSON:

{
   "title": "Some Name",
   "more": "data"
}

和其他人以下列方式返回数据:

{
    "key": {
        "title": "Some Name",
        "more": "data"
    }
}

我想做的是传入一个可选的 gson 转换器。

fun createService(): ApiInterface {
    return buildService()
}


fun <T>createService(targetClass: Class<T>, key: String): ApiInterface {
    targetClass: Class<T>
    key: String
    var gson: Gson = GsonBuilder()
        .registerTypeAdapter(targetClass, RestDeserializer(targetClass, key))
        .create()

       return buildService(gson)
   } 

   fun buildService(gson: Gson?): ApiInterface {
       // build my builder
       val retrofit = Retrofit.Builder()
           .baseUrl(API_BASE_URL)

            /// I WANT TO PASS gson here IF it exists..
            .addConverterFactory(GsonConverterFactory.create(gson??))  <------- Pass in gson ONLY if it's not null??

            .addConverterFactory(ScalarsConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
            .addCallAdapterFactory(NetworkResponseAdapterFactory())
            .client(client.build())
            .build()

       return retrofit.create(ApiInterface::class.java)  
   }
   

如果我在 gson 为 null 时传入它,我会收到错误

仅当它不为空时,我如何才能传入 gson?

标签: kotlinretrofit

解决方案


我不确定我是否正确理解了您的问题。如果我这样做,你只需要一个空检查。

fun buildService(gson: Gson?): ApiInterface {
    val retrofitBuilder = Retrofit.Builder()
        .baseUrl(API_BASE_URL)

    if(gson != null) {
        retrofitBuilder.addConverterFactory(GsonConverterFactory.create(gson))
    }

    val retrofit = retrofitBuilder.
        .addConverterFactory(ScalarsConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
        .addCallAdapterFactory(NetworkResponseAdapterFactory())
        .client(client.build())
        .build()

    return retrofit.create(ApiInterface::class.java)  
}

推荐阅读