当前位置: 首页 > 面试题库 >

如何在反序列化JSON响应中使用Gson处理NumberFormatException

高化
2023-03-14
问题内容

我正在读取Gson的JSON响应,该响应返回somtimes
a,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值,所以抛出a 。

有没有办法告诉Gson:“ 如果反序列化runtimeType
的字段Foo并且存在NumberFormatException,则只需返回默认值0
”即可?

我的解决方法是使用a String作为runtime字段的Type 而不是int,但是也许有更好的方法来处理此类错误。


问题答案:

最初,我尝试为Integer值编写一个通用的自定义类型适配器,以捕获NumberFormatException和返回0,但Gson不允许基本类型的TypeAdaptors:

java.lang.IllegalArgumentException: Cannot register type adapters for class java.lang.Integer

之后,我FooRuntime为该runtime字段引入了一个新的Type ,因此Foo该类现在如下所示:

public class Foo
{
    private String name;
    private FooRuntime runtime;

    public int getRuntime()
    {
        return runtime.getValue();
    }
}

public class FooRuntime
{
    private int value;

    public FooRuntime(int runtime)
    {
        this.value = runtime;
    }

    public int getValue()
    {
        return value;
    }
}

类型适配器处理自定义反序列化过程

public class FooRuntimeTypeAdapter implements JsonDeserializer<FooRuntime>, JsonSerializer<FooRuntime>
{
    public FooRuntime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        int runtime;
        try
        {
            runtime = json.getAsInt();
        }
        catch (NumberFormatException e)
        {
            runtime = 0;
        }
        return new FooRuntime(runtime);
    }

    public JsonElement serialize(FooRuntime src, Type typeOfSrc, JsonSerializationContext context)
    {
        return new JsonPrimitive(src.getValue());
    }
}

现在必须使用GsonBuilder注册类型适配器,因此将空字符串解释为0而不是抛出NumberFormatException

String input = "{\n" +
               "   \"name\" : \"Test\",\n" +
               "   \"runtime\" : \"\"\n" +
               "}";

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(FooRuntime.class, new FooRuntimeTypeAdapter());
Gson gson = builder.create();
Foo foo = gson.fromJson(input, Foo.class);


 类似资料:
  • 问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…

  • 问题内容: 我有一个Vendor对象,可以从一个单独的“ vendor” json序列中反序列化,但是我想将此序列反序列化为一个,我只是想不出如何让Jackson合作。有小费吗? 问题答案: 您的数据存在问题,因为您的数组中有内部 包装 对象。想必你的对象被设计成手柄,,,但每次的多个对象也都包裹在一个对象与单一属性。 我假设您正在使用Jackson 数据绑定 模型。 如果是这样,那么有两件事要考

  • 问题内容: 简而言之,这是我想在JAVA中解析的JSON对象的草图: 这些是我为解析而创建的 POJO (为简洁起见,我将省略这些语句): (1)完整的JSON对象的表示形式 (2)嵌套对象的表示: (3)项目的表示: 现在,创建一个Gson实例(用于导入), 每当我尝试访问可解析对象时(例如通过),都会收到一个。但是,Gson 确实 创建了我指定的类的对象,并且 不会 引发任何后续错误。 我知道

  • 当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?

  • 问题内容: 我使用了很多不可变的集合,并且很好奇如何使用Gson反序列化它们。由于没有人回答,而且我自己找到了解决方案,因此我正在简化问题并提出自己的答案。 我有两个问题: 如何为所有人编写一个作品? 如何全部注册? 问题答案: 更新:有https://github.com/acebaggins/gson- serializers ,其中涵盖了许多番石榴集合: 如何编写适用于所有Immutable