gpt4 book ai didi

android - 改造和 Moshi : how to handle com. squareup.moshi.JsonDataException

转载 作者:行者123 更新时间:2023-12-05 00:01:17 29 4
gpt4 key购买 nike

此场景发生在使用 Retrofit2 和 Moshi 进行 JSON 反序列化的 Android 应用中。

如果您无法控制服务器的实现,并且该服务器在响应请求的方式上有不一致的行为(也称为“坏情况”):

有没有办法在不崩溃的情况下处理 com.squareup.moshi.JsonDataException?

例如,您需要一个 JSONArray,而这里出现了一个 JSONObject。碰撞。除了让应用程序崩溃之外,还有其他方法可以解决这个问题吗?

此外,如果服务器的实现已更新,向用户显示一条错误消息,而不是让它崩溃/完全停止服务,即使是一个错误的请求,不是更好吗?

最佳答案

使用 Retrofit 进行调用并使用 try 和 catch 来处理异常,类似于:

class NetworkCardDataSource(
private val networkApi: NetworkCardAPI,
private val mapper: CardResponseMapper,
private val networkExceptionMapper: RetrofitExceptionMapper,
private val parserExceptionMapper: MoshiExceptionMapper
) : RemoteCardDataSource {

override suspend fun getCard(id: String): Outcome<Card, Throwable> = withContext(Dispatchers.IO) {
val response: Response<CardResponseJson>
return@withContext try {
response = networkApi.getCard(id)
handleResponse(
response,
data = response.body(),
transform = { mapper.mapFromRemote(it.card) }
)
} catch (e: JsonDataException) {
// Moshi parsing error
Outcome.Failure(parserExceptionMapper.getException(e))
} catch (e: Exception) {
// Retrofit error
Outcome.Failure(networkExceptionMapper.getException(e))
}
}

private fun <Json, D, L> handleResponse(response: Response<Json>, data: D?, transform: (D) -> L): Outcome<L, Throwable> {
return if (response.isSuccessful) {
data?.let {
Outcome.Success(transform(it))
} ?: Outcome.Failure(RuntimeException("JSON cannot be deserialized"))
} else {
Outcome.Failure(
HTTPException(
response.message(),
Exception(response.raw().message),
response.code(),
response.body().toString()
)
)
}
}
}

哪里:

  • networkApi 是您的 Retrofit 对象,
  • mapper 是一个类,用于将接收到的对象映射到应用中使用的另一个对象(如果需要),
  • networkExceptionMapperparserExceptionMapper 分别将 Retrofit 和 Moshi 异常映射到您自己的异常,这样 Retrofit 和 Moshi 异常就不会遍布您的应用程序(如果需要),
  • Outcome 只是一个 iOS Result 枚举副本,用于返回 Success 或 Failure 结果,但不会同时返回两者,
  • HTTPException 是一个自定义的运行时异常,用于返回不成功的请求。

这是来自 clean architecture example project 的 fragment .

关于android - 改造和 Moshi : how to handle com. squareup.moshi.JsonDataException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39424582/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com