问题: 反序列化时实体类型为 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。
...