我使用改造来实现这样的界面:
Observable<QueryResult> queryData(@Body QueryParams params);
并定义QueryResult类:
class QueryResult {
int count;
...
}
当我执行queryData语句时,它会产生以下错误:
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Invalid double: ""
显然,它是由api返回的数据引起的:
{"count":"",...}
“count”旨在表示一个数字,但不知何故或有时,服务器开发人员希望使用“”来表示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;
}
}
但是有更好的方法来处理吗?将计数声明为String似乎不太直观。我想可以选择配置改造。
更新 感谢有关提高效率的建议的答案,并在gson转换器中注册TypeAdapter。 但我想知道的是,错误句柄是否可以由改造库本身完成。我的观点是,当我最初将count字段声明为int时,它可以处理来自服务器的整数和字符串类型的值,如:
{"count":123,...} or {"count":"123",...}
没有错误。所以我假设错误句柄可以与库本身中的整数配对行为一起完成。
提前致谢。
答案 0 :(得分:1)
在将 count
转换为空之前,请检查 public class QueryResult {
String count;
int getCount() {
try {
if (!TextUtils.isEmpty(count)) {
return Integer.parseInt(count);
}
} catch (NumberFormatException e) {
}
return 0;
}
}
是否为空
或更好地更改后端的响应
试试这个
"scripts": {
"cypress:open:dev": "CYPRESS_BASE_URL=http://localhost:3000 cypress open",
"cypress:open:prod": "CYPRESS_BASE_URL=http://mycompanydomain.com cypress open",
"cypress:run:dev": "CYPRESS_BASE_URL=http://localhost:3000 cypress run",
"cypress:run:prod": "CYPRESS_BASE_URL=http://mycompanydomain.com cypress run",
}
答案 1 :(得分:1)
首先,API响应中的这种不一致行为是不可行的。 改造将无法处理这种情况。您必须像问题中提到的那样手动处理此响应。但是您可以像这样有效地执行此操作
class QueryResult {
Object count; // change to Object;
int getCount() {
// do the error handling
if (count instanceof Integer) {
return ((Integer) count);
} else {
return 0;
}
}
}
答案 2 :(得分:0)
我能告诉你的最甜蜜的方式就是像你一样解析双倍。
Double ans=Double.ParseDouble(yourstringvalue);
这使ans成为双倍。
我在这里遇到的问题是你收到一个空字符串""
只需将条件设置为
Double ans=0.0
if(yourstringvalue!="" || yourstringvalue!=null){
// then parse here
ans=Double.ParseDouble(yourstringvalue);
}
您将在ans
继续进行
if(ans!=0.0){
//do your task here
}
答案 3 :(得分:0)
只需使用 Object 而不是原始数据类型。而不是 int 使用 Integer 对象。 Integer 类将原始类型 int 的值包装在一个对象中。对象类可用于 Java 中的所有原始数据类型
如果未找到值并且原始数据类型(int、double)无法处理空值并给出此错误,则改造返回空值。原始数据类型的对象类可以处理空值
在您的情况下,如果此计数变量是异常的原因,则此更改可能会解决您的问题
class QueryResult {
Integer count;
...
}
但您的例外情况是双重的。我认为错误是因为某些变量是双数据类型并获得空值。只需将原始 double 更改为 Double 对象即可解决您的问题
Double var;