我正在阅读一个带有Gson的JSON响应,它有时会返回一个NumberFormatException
,因为预期的int
值被设置为空字符串。现在我想知道处理这种异常的最佳方法是什么。如果值是空字符串,反序列化应该是0。
预期的JSON回应:
{
"name" : "Test1",
"runtime" : 90
}
但有时运行时是一个空字符串:
{
"name" : "Test2",
"runtime" : ""
}
java类如下所示:
public class Foo
{
private String name;
private int runtime;
}
反序列化是这样的:
String input = "{\n" +
" \"name\" : \"Test\",\n" +
" \"runtime\" : \"\"\n" +
"}";
Gson gson = new Gson();
Foo foo = gson.fromJson(input, Foo.class);
它会掷回com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
,因为传回的是空的String,而不是int值。
有没有办法告诉Gson,“* 如果您反序列化类型为Foo
的字段runtime
,并且出现NumberFormatException,则只返回默认值0*"?
我的解决方法是使用String
作为runtime
字段的类型,而不是int
,但可能有更好的方法来处理此类错误。
8条答案
按热度按时间mlmc2os51#
下面是我为
Long
类型创建的一个示例。这是一个更好的选择:使用
Gson
util注册适配器:您可以参考this link以了解更多信息。
xxhby3vn2#
起初,我试图为Integer值编写一个通用的自定义类型适配器,以捕获
NumberFormatException
并返回0,但Gson不允许为原始类型编写TypeAdaptors:之后,我为
runtime
字段引入了一个新的类型FooRuntime
,因此Foo
类现在看起来如下所示:类型适配器处理自定义反序列化过程:
现在需要使用
GsonBuilder
来注册类型适配器,因此空字符串将被解释为0,而不是抛出NumberFormatException
。bjg7j2ky3#
快速简单的解决方法--只需将运行时的成员类型字段更改为String,并通过getter(以int形式返回运行时)访问它:
=〉不需要json反序列化
pcww981p4#
我创建了这个TypeAdapter,它检查空字符串并返回0
}
qmelpv7a5#
正如在另一个注解中所说的,从GSON 2.3.1开始,你可以为原始类型注册类型适配器,这里有一个类型适配器,它可以处理int和Integer类型,并且可以很好地默认为0(或null),用于字符串、布尔值和null。这将继续解析包含数字的字符串,如“runtime”:“五”。
您可以使用以下代码注册它
请注意,它所替换的普通JsonReader.nextInt()尝试调用标记上的parseInt和parseDouble,因此这将复制用于解析整数的内部逻辑。
bt1cpqcv6#
在NumberFormatException的情况下,始终假定
runtime
字段的默认值为0
可能会有所帮助,因为它可能是唯一的错误源。lo8azlld7#
此解决方案适用于Double类型。这只适用于非基元类型:
产品型号:
改装客户:
qlzsbp2j8#
我喜欢无适配器
请原谅我,如果这看起来冒犯,但是,我不得不改变我的
Model Class
类型所有的String
,以克服这个问题比如我有
我遇到了NumberFormatException,因此我将其更改为
现在,我将它们作为