给予GSON一个类型进行反序列化,如果json不匹配,用另一个反序列化(AndroidKotlin)

6ju8rftf  于 2023-04-06  发布在  Android
关注(0)|答案(1)|浏览(136)

我正在做一个应用程序,它必须从多个API获得响应,它们服务于相同的工作,但它们是不同的。

{
  "token": "AAAAABBBBB",
  "expires": "unixtimestamp",
  "username": "aaa",
  "password": "bbb"
}

另一个可以遵循OAuth标准

{
  "access_token": "AAAABBBBCCCC",
  "refresh_token": "BBBBCCCCDDDD",
  "expires_in": 3599
}

我已经有了数据类的类型,并且知道什么API正在响应(所以我可以匹配数据类),我想知道是否有比when表达式更好的替代方案。
谢谢大家。

ktecyv1j

ktecyv1j1#

我真的不知道你在这里问什么。
如果你有两个不同的返回值,这两个返回值表示凭证应该在下游被不同地处理,但你仍然想返回其中的任何一个,我建议使用一个密封类来对数据进行建模。

sealed class Credentials {
   data class BasicAuth(...): Credentials()
   data class OAuth(...): Credentials()
}

suspend fun getCredentials(): Credentials {
   val json: String = doStuff() // suspending function

   return serializeOAuth(json) ?: serializeBasic(json) ?: // throw or null
   private fun serializeOAuth(json: String): OAuth? = 
     try { 
         Gson().fromJson(json, OAuthCredentials::class)
     } catch(...) { return null }

   private fun serializeBasic(json: String): BasicAuth? = 
     try { 
         Gson().fromJson(json, BasicAuth::class)
     } catch(...) { return null }
}

如果这对你没有帮助,也许你可以详细说明问题是什么。

相关问题