1、简述
> 番外篇 如何序列化值为null的属性 方式1: new GsonBuilder().serializeNulls().create(); 方式2: 重写相应的 TypeAdapters 解析规则 -- 将null 转换为空字符串 方式3: 自定义 TypeAdapterFactory下面重点介绍方式2 和 方式3
2、方式2 重写TypeAdapters的解析规则
通过new Gson()查看对应的构造器 , Gson的数据解析都是委托到各个TypeAdapter内进行处理的。 在Gson的构造函数内会预先加载一部分TypeAdapter, 包含String、int、long、double等类型,都存放在factories中,如下: 发现都可以通过自定义TypeAdapter解决。 自定义TypeAdapter,将其放入facotries中, 并且gson在解析json时使用对应的TypeAdapter来的, 而我们手动添加的TypeAdapter会优先于预设的TypeAdapter被使用 因此 我们来覆盖 一些常用的包装类型的 null值的序列化 重写自己的TypeAdapters
package sun.rain.amazing.gson.type; 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; /** * 变成不可被继承的 * @author sunRainAmazing */ public final class TypeAdaptersRedefine { public static final String EMPTY = ""; /** * 对于String 类型 的 策略 */ public static final TypeAdapter<String> STRING = new TypeAdapter<String>() { //进行反序列化 @Override public String read(JsonReader reader) { try { if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return null; } //要进行属性值的判断 若为 空字符串 则返回null 否则返回 本身的值 String result = reader.nextString(); return result.length() > 0 ? result : null; } catch (Exception e) { throw new JsonSyntaxException(e); } } // 进行序列化 @Override public void write(JsonWriter writer, String value) { try { if (value == null) { writer.value(EMPTY); return; } writer.value(value); } catch (Exception e) { e.printStackTrace(); } } }; /** * 对于int 和 Integer 类型 * 由于 int 类型 有默认值 0, * -- 通常我们无法确定 0 是否具备实际意义 * 但是 Integer 的类型 null , 我们可以确定的是 -- 无意义的 * * 因此在设计属性的类型是 通常采用 Integer 而不是 int 类型 * * 故 由于 int 的 0 具备 实际意义 -- 不进行转换 * 而是转换 Integer 类型的 null 值 */ public static final