首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改造与Moshi:如何处理com.squareup.moshi.JsonDataException

改造与Moshi:如何处理com.squareup.moshi.JsonDataException
EN

Stack Overflow用户
提问于 2016-09-10 09:19:30
回答 1查看 755关注 0票数 3

这个场景发生在一个安卓应用程序中,它使用Retrofit2和Moshi进行JSON反序列化。

在无法控制服务器实现的情况下,所述服务器在响应请求(也称为“坏情况”)方面具有不一致的行为:

有办法处理com.squareup.moshi.JsonDataException而不崩溃吗?

例如,您需要一个JSONArray,接下来是一个JSONObject。撞车。有其他方法来处理这个问题,而不是让应用崩溃吗?

另外,在服务器的实现被更新的情况下,向用户显示错误消息不是更好,而不是让它崩溃/完全停止服务,即使是一个错误的请求?

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 07:06:04

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

代码语言:javascript
复制
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是你的重装对象,
  • mapper是一个类,用于将接收到的对象映射到应用程序中使用的另一个对象(如果需要的话),
  • networkExceptionMapperparserExceptionMapper分别将重配置和Moshi异常映射到您自己的异常,以便重新配置和Moshi异常不会在应用程序中到处传播(如果需要的话),
  • Outcome只是一个iOS Result枚举副本,可以返回一个成功的结果,也可以返回一个失败的结果,
  • HTTPException是一个自定义运行时异常,用于返回不成功的请求。

这是一个来自清洁建筑示例项目的片段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39424582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档