TypeAdapter的使用动机
Gson在序列化和反序列化时,默认情况下,是按照POJO类的字段属性名和JSON串键进行一一映射匹配,然后把JSON串的键对应的值转换成POJO相同字段对应的值,反之亦然,在这个过程中有一个JSON串Key对应的Value和对象之间如何转换(序列化/反序列化)的问题。
以Date为例,在序列化和反序列化时,Gson默认使用java.text.DateFormat将Date对象进行序列化成日期字符串, 以及将日期字符串反序列化为Date对象。
这种默认的转换逻辑,大多数情况下能够满足需求,不过有时我们需要自定义这个转换的逻辑,比如在JSON串中定义的是日期的毫秒数,而POJO中定义的是Date类型,为了适配这种类型(字串符数字和Date)的转换,Gson提供了类型适配器。通过类型适配器这种扩展机制,Gson的使用者可以根据实际的需要对某个具体类型的序列化和反序列化的转换进行控制
Date和字符串日期毫秒数适配
将日期类型序列化和反序列化长整数字符串(串中以长整数毫秒数表示日期)
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.util.Date; class LongDateTypeAdapter extends TypeAdapter<Date> { @Override public void write(JsonWriter out, Date value) throws IOException { if (value == null) { out.nullValue(); } else { out.value(value.getTime()); } } @Override public Date read(JsonReader in) throws IOException { if (in.peek() == null) { return null; } String str = in. nextString(); Date d = new Date(Long.parseLong(str)); return d; } } class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Test { public static void main(String[] args) { Date d = new Date(); Model m = new Model(); m.setDate(d); Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new LongDateTypeAdapter()).create(); String str = gson.toJson(m); System.out.println(str); //{"date":1407921708088} m = gson.fromJson(str, Model.class); System.out.println(m.getDate().getTime()); //1407921708088 } }
上例中,将Model对象序列化为{"date":1407921708088},然后把{"date":1407921708088}反序列化为Model对象,Gson通过自定义的类型适配器LongDateTypeAdapter将日期类型Date和Long进行了适配。
数字和Enum类型的适配
import com.google.gson.Gson; import com.google.gson.GsonBuilder; 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; enum Status { OK, ERROR, UNKNOWN; } class EnumTypeAdapter extends TypeAdapter<Status> { @Override public Status read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { return null; } else { int status = in.nextInt(); if (status == 0) { return Status.OK; } else if (status == 1) { return Status.ERROR; } else { return Status.UNKNOWN; } } } @Override public void write(JsonWriter out, Status value) throws IOException { if (value == null) { out.nullValue(); } else if (value == Status.OK) { out.value(0); } else if (value == Status.ERROR) { out.value(1); } else { out.value(2); } } } public class Test { public static void main(String[] args) { Gson gson = new GsonBuilder().registerTypeAdapter(Status.class, new EnumTypeAdapter()).create(); String str = gson.toJson(Status.OK); System.out.println(str);//0 Status status = gson.fromJson(str, Status.class); System.out.println(status);//OK } }
Gson预定义适配器
上面说到了,Gson默认使用java.text.DateFormat对日期和字符串进行转换,那么这种转换逻辑是如何实现的?这是使用了Gson预定义的适配器DateTypeAdapter, Gson预定义适配器在第七部分进行分析
相关推荐
注册自定义的TypeAdapter后,Gson会使用这些适配器进行序列化和反序列化操作。这使得我们能够在数据从JSON到Java对象的转换过程中加入业务逻辑,以满足特定的需求。 综上所述,`Gson TypeAdapter`提供了强大的灵活...
4. **类型适配器(TypeAdapter)**:Gson允许用户自定义类型适配器,以处理特定类型的序列化和反序列化逻辑,特别是对于复杂或者自定义的Java类型。 5. **字段注解(Field Annotations)**:Gson支持通过在Java字段...
- **类型适配器**:通过创建`TypeAdapter`并注册到`GsonBuilder`,可以完全控制特定类型的序列化和反序列化过程。 7. **注意事项** - 当对象包含循环引用时,Gson可能会导致无限递归错误。可以使用`@Expose`注解...
本篇文章将详细探讨如何通过自定义Gson适配器实现枚举类型的统一序列化和反序列化处理,无需预先定义枚举,也无需修改Gson源码。 首先,Gson是Google提供的一个开源库,用于在Java对象和JSON数据之间进行映射。默认...
3. **类型适配器**:Gson允许用户自定义类型适配器(TypeAdapter),以处理特殊的数据类型或者自定义的序列化和反序列化逻辑。这对于处理复杂的或自定义的对象模型非常有用。 4. **流式API**:Gson提供了流式API,...
这个过程涉及到类型适配器(TypeAdapter)和反射机制,使得Gson能够处理各种复杂的Java类结构。 在Gson源码中,我们可以看到以下几个关键组件: 1. **TypeToken**: 这个类用于存储泛型类型信息,因为Java的泛型在...
- Gson允许自定义类型适配器来处理特定类型的数据转换,比如日期、自定义对象等。通过实现`TypeAdapter`接口,你可以控制JSON序列化和反序列化的具体逻辑。 3. **字段注解(Field Annotations)**: - Gson提供了...
2. **类型适配器(Type Adapters)**:用户可以通过自定义TypeAdapter来控制特定类型的序列化和反序列化过程,以满足特殊需求。 3. **注解支持**:Gson允许使用注解(如`@Expose`、`@SerializedName`等)来指定哪些...
3. **类型适配器(TypeAdapter)**:Gson允许自定义数据类型的序列化和反序列化过程,通过实现`TypeAdapter`接口,可以对特定类型的数据进行特殊处理。 4. **字段命名策略**:Gson支持不同的字段命名策略,比如保持...
Gson提供了`@JsonAdapter`注解以及自定义类型适配器(TypeAdapter)来实现这一功能。 ```java @JsonAdapter(MyCustomAdapter.class) class User { // fields and methods... } ``` 在上述代码中,`MyCustomAdapter...
- **类型适配器(TypeAdapter)**:Gson提供了自定义类型转换的机制,你可以创建自己的TypeAdapter来处理特定类型的序列化和反序列化。 - **字段映射控制**:可以通过注解(@Expose)来控制哪些字段会被序列化或反序列...
- **类型适配器**:如果你需要更精细的控制转换过程,可以实现`TypeAdapter`接口,Gson会使用这些适配器进行特定类型的转换。 - **运行时类型信息**:Gson可以处理运行时的类型信息,允许将JSON转换为未知类型。 - *...
3. **类型适配器(TypeAdapter)**:Gson允许自定义类型转换逻辑,这在处理特定类型的字段时非常有用。你可以创建一个TypeAdapter,并通过GsonBuilder注册它,这样Gson在序列化或反序列化时会使用这个自定义的转换...
3. **类型适配器**:Gson允许用户自定义数据转换规则,通过实现`JsonSerializer`和`JsonDeserializer`接口,可以控制特定类型的序列化和反序列化过程。 4. **字段注解**:Gson支持使用Java注解来控制哪些字段被序列...
- **类型适配器(TypeAdapter)**:如果默认的序列化和反序列化方式不满足需求,可以通过自定义TypeAdapter来进行定制。 - **运行时注解处理(Runtime Type Adaptation, RTA)**:Gson允许在运行时动态指定类型,...
4. **类型适配器(TypeAdapter)**:如果标准的序列化和反序列化方式不能满足需求,可以通过自定义TypeAdapter来定制JSON转换规则。 5. **字段映射控制**:Gson允许开发者通过注解(如`@Expose`和`@SerializedName`...
3. **类型适配器(TypeAdapter)**:Gson允许自定义类型适配器,以处理特定类型的序列化和反序列化,如日期、自定义类等,确保数据转换的准确性和灵活性。 4. **复杂对象处理**:Gson能处理嵌套的对象和数组,以及...
2. **类型适配器**:`TypeAdapterFactory`和`TypeAdapter`的实现,以及它们在序列化和反序列化过程中的作用。 3. **性能优化**:GSON是如何处理性能问题的,例如缓存、类型信息的预处理等。 4. **错误处理**:当遇到...
3. **类型适配器**:Gson允许自定义类型适配器(TypeAdapter),这样可以处理那些默认情况下无法正确转换的复杂数据结构,比如自定义的日期格式或者特殊的枚举类型。 4. **字段注解**:通过使用Gson提供的注解(如`...
3. **类型适配器**:为了处理自定义的复杂数据结构,Gson允许开发者创建自己的类型适配器(TypeAdapter)。通过实现`JsonSerializer<T>`和`JsonDeserializer<T>`接口,开发者可以定制JSON序列化和反序列化的逻辑。 ...