改造 - 如何在改造中错误处理 NumberFormatException?

Pai*_*ang 6 java android json retrofit retrofit2

我使用改造来实现这样的接口:

Observable<QueryResult> queryData(@Body QueryParams params);
Run Code Online (Sandbox Code Playgroud)

并定义 QueryResult 类:

class QueryResult {
    int count;
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我执行 queryData 语句时,它会产生以下错误:

com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Invalid double: ""
Run Code Online (Sandbox Code Playgroud)

显然,这是由 api 返回的数据引起的,如下所示:

{"count":"",...}
Run Code Online (Sandbox Code Playgroud)

“计数”旨在表示一个数字,但不知何故或有时,服务器开发人员希望使用“”来表示 0。

我的问题是我如何错误地处理这种情况?

我试图在 QueryResult 类中进行错误处理:

class QueryResult {
    String count; // change from int to String;
    ...
    int getCount() {
        // do the error handling
        int ret = 0;
        try {
            ret = Integer.parseInt(count);
        } catch (Exception e) {}
        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是有没有更好的处理方法?将计数声明为字符串似乎不太直观。我假设可以有一个选项来配置改造。

更新 感谢您对提高效率和在 gson 转换器中注册 TypeAdapter 的建议的回答。但我想知道的是错误句柄是否可以由改造库本身完成。观点是,当我最初将count字段声明为int时,它可以处理来自服务器的整数和字符串类型的值,例如:

{"count":123,...} or {"count":"123",...}
Run Code Online (Sandbox Code Playgroud)

没有错误。所以我假设错误句柄可以与库本身中的整数配对行为一起完成。

提前致谢。

Bur*_*hid 2

首先,API 响应中这种不一致的行为是不可行的。改造将无法处理这种情况。您必须按照问题中提到的那样手动处理此响应。但是您可以通过像这样的有效方式来做到这一点

class QueryResult {

        Object count; // change to Object;

        int getCount() {
            // do the error handling
            if (count instanceof Integer) {
                return ((Integer) count);
            } else {
                return 0;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)