问题:

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

1
2
3
4
5
6
#json  
{"a":""}  
#伪代码  
class test {  
  private Integer a;  
}

解决方法:

为gson注册一个适配器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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);  
        }  
    }

}
1
2
3
4
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