How to handle a NumberFormatException with Gson in deserialization a JSON response

后端 未结 7 667
情深已故
情深已故 2020-12-01 03:45

I\'m reading a JSON response with Gson, which returns somtimes a NumberFormatException because an expected int value is set to an empty string. Now

7条回答
  •  被撕碎了的回忆
    2020-12-01 03:55

    At first, I tried to write a general custom type adaptor for Integer values, to catch the NumberFormatException and return 0, but Gson doesn't allow TypeAdaptors for primitive Types:

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

    After that I introduced a new Type FooRuntime for the runtime field, so the Foo class now looks like this:

    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;
        }
    }
    

    A type adaptor handles the custom deserialization process:

    public class FooRuntimeTypeAdapter implements JsonDeserializer, JsonSerializer
    {
        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());
        }
    }
    

    Now it's necessary to use GsonBuilder to register the type adapter, so an empty string is interpreted as 0 instead of throwing a 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);
    

提交回复
热议问题