目录

gson java.lang.NumberFormatException: empty String

问题:

反序列化时实体类型为 int/Integer/Long 等等,而json字段为string,如下

#json  
{"a":""}  
#伪代码  
class test {  
  private Integer a;  
}

解决方法:

为gson注册一个适配器

import com.google.gson.JsonSyntaxException;  
import com.google.gson.TypeAdapter;  
import com.google.gson.stream.JsonReader;  
import com.google.gson.stream.JsonToken;  
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

public class IntTypeAdapter extends TypeAdapter<Integer> {  
    @Override  
    public void write(JsonWriter out, Integer value)  
            throws IOException {  
        out.value(value);  
    }

    @Override  
    public Integer read(JsonReader in) throws IOException {  
        JsonToken peek = in.peek();  
        if (peek == JsonToken.NULL) {  
            in.nextNull();  
            return null;  
        }

        try {  
            String result = in.nextString();  
            if ("".equals(result)) {  
                return null;  
            }  
            return Integer.parseInt(result);  
        } catch (NumberFormatException e) {  
            throw new JsonSyntaxException(e);  
        }  
    }

}
private Gson gson = new GsonBuilder()  
            .registerTypeHierarchyAdapter(Integer.class, new IntTypeAdapter())  
            //.registerTypeHierarchyAdapter(Long.class, new LongTypeAdapter())  
            .create();

需要注意的是, registerTypeHierarchyAdapter 里的类型一定要准确,一开始百度出来的是用 Number,会无法进入适配器,比如 https://www.jianshu.com/p/081ab69cf9a8 ,注册的是 int和integer,但TypeAdapter 是number。

参考文章:

https://www.jianshu.com/p/081ab69cf9a8

https://stackoverflow.com/questions/8863429/how-to-handle-a-numberformatexception-with-gson-in-deserialization-a-json-respon