最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度的值是double的默认值,那么返回0,而不是返回0.0,而我处理json一般使用的Gson来处理,如果简单的直接使用 new Gson().toJson(obj) 这种形式,那么是达不到我们想要的结果,因此我们需要自定义 Gson 的序列化来实现我们想要的结果,而 Gson 的TypeAdapter正好可以实现我们的功能。
TypeAdapter是 Gson 提供的用于某种类型的 序列化和反序列操作,并且它是强类型操作。比如TypeAdapter<Double>就只可以序列化和反序列操作Double这种类型,而不会对别的类型生效。TypeAdapter的使用需要注册到 Gson 的实例上。new GsonBuilder().registerTypeAdapter(类型,TypeAdapter实例).create();
需求:
1、向前台返回一个地理位置的 json 数据,其中 经纬度是Double类型,如果Double的值是0时,页面上json的格式是 {key:0} 不可以是 {key:0.0}
2、如果 Double 类型的数据值是 null,那么不向页面上返回。
实现:
1、自定义一个 TypeAdapter 来处理 Double 类型的数据
一、定义一个地理位置 Location 对象
@SerializedName 注解表示序列化后 json 的key 的是什么样的。
/** * 地理位置 * * @author huan.fu * @date 2018/8/15 - 10:50 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Location { /** * 纬度 */ @SerializedName("longitude") private Double lat; /** * 经度 */ private Double lng; /** * 详细地址 */ @SerializedName("detail_address") private String detailAddress; }
二、定义一个 TypeAdapter,用来处理 Double 类型的数据
/** * 序列化和反序列化 Double 类型的数据 * * @author huan.fu * @date 2018/8/15 - 11:26 */ public class DoubleTypeAdapter extends TypeAdapter<Double> { /** * 序列化操作 * * @param out * @param value * @throws IOException */ @Override public void write(JsonWriter out, Double value) throws IOException { // 如果 value 没有值,那么不进行序列化 if (null == value) { out.nullValue(); // 如果 value 的值为 0,那么输出0,不输出默认的 0.0 } else if (value.equals(0D)) { out.value(0); // 否则直接输出 } else { out.value(value); } } /** * 反序列操作 * * @param in * @return * @throws IOException */ @Override public Double read(JsonReader in) throws IOException { return null; } }
三、测试代码
注意:TypeApapter 的使用,需要先进行注册,否则不生效。
/** * 测试 gson 的 double 处理 * * @author huan.fu * @date 2018/8/15 - 10:53 */ public class GsonTest { @Test public void doubleGsonAdapterTest() { Location location = Location.builder() .lat(0D) .lng(1.1D) .detailAddress(null) .build(); // 不使用 adapter 处理 double System.out.println(new Gson().toJson(location)); System.out.println("========================="); // 使用 adapter 处理 double Gson gson = new GsonBuilder() .registerTypeAdapter(Double.class, new DoubleTypeAdapter()) .create(); System.out.println(gson.toJson(location)); } }
四、结果
相关推荐
要实现自定义的枚举序列化和反序列化,我们需要创建一个继承自`Gson.TypeAdapter`的类。这个类需要重写`read()`和`write()`方法。`read()`方法负责将JSON解析为枚举值,而`write()`方法则将枚举值转化为JSON。下面是...
TypeAdapter是Gson框架中用于自定义序列化和反序列化的组件,它可以让我们对JSON数据的转换过程进行更细粒度的控制。通过创建并注册一个TypeAdapter,我们可以定制JSON字符串到Java对象的转换规则,反之亦然。 **...
针对枚举类型,我们可以创建一个自定义的`TypeAdapter`,以实现统一的序列化和反序列化逻辑。`TypeAdapter`是Gson框架的一部分,它可以自定义数据的读写方式。下面,我们将展示如何为多个枚举类型创建一个通用的`...
类型适应器是GSON库中实现自定义序列化和反序列化的关键接口。通过实现`read()`和`write()`方法,可以处理自定义类型的JSON转换逻辑。 5. **字段注解** GSON提供了一系列注解来控制JSON序列化和反序列化的行为,...
有时,JSON结构可能与Java对象不完全匹配,这时可以自定义序列化和反序列化的逻辑。Gson提供了`@JsonAdapter`注解以及自定义类型适配器(TypeAdapter)来实现这一功能。 ```java @JsonAdapter(MyCustomAdapter....
通过对gson-2.1源码的学习,开发者不仅可以理解Gson的工作原理,还能掌握如何利用其强大的自定义序列化和反序列化功能,以满足各种复杂的JSON数据处理需求。这对于进行Android开发或者任何Java项目中的数据交换都是...
Gson库还支持自定义序列化和反序列化的逻辑,通过注解或自定义类型适配器实现。例如,你可以使用`@Expose`注解来指定哪些字段应该被包含在JSON中,或者创建一个`TypeAdapter`来处理特定类型的转换。 在“Gson驱动”...
- **字段映射控制**:可以通过注解(@Expose)来控制哪些字段会被序列化或反序列化,或者自定义序列化和反序列化的过程。 - **复杂类型支持**:Gson支持包括数组、集合、Map、枚举、自定义类等多种复杂类型的数据结构...
你可以创建一个TypeAdapter,并通过GsonBuilder注册它,这样Gson在序列化或反序列化时会使用这个自定义的转换逻辑。 4. **注解(Annotations)**:Gson支持使用注解来控制序列化和反序列化的行为。例如,`@Expose`...
此外,Gson还提供了一些高级特性,如`JsonParser`用于逐项解析JSON流,`JsonElement`表示JSON结构的抽象,以及`TypeAdapter`和`GsonBuilder`用于自定义序列化和反序列化过程。 在实际应用中,Gson因其简洁的API和高...
4. **自定义序列化和反序列化**: 用户可以通过实现`JsonSerializer`和`JsonDeserializer`接口来自定义特定类型的数据转换逻辑。 在GSON的源码中,关键类包括: - `GsonBuilder`: 用于构建自定义配置的`Gson`实例。...
4. **类型适配器(TypeAdapter)**:Gson允许用户自定义类型适配器,以处理特定类型的序列化和反序列化逻辑,特别是对于复杂或者自定义的Java类型。 5. **字段注解(Field Annotations)**:Gson支持通过在Java字段...
Gson可以轻松地处理Java集合(如List、Set、Map)和数组的序列化和反序列化。 6. **日期格式化** 可以通过自定义`JsonSerializer`和`JsonDeserializer`来处理日期格式。 7. **自定义异常处理** 可以捕获并...
- **自定义序列化和反序列化**:你可以通过实现`JsonSerializer`和`JsonDeserializer`接口来自定义特定类型的转换逻辑。 - **类型适配器(TypeAdapter)**:当默认的序列化和反序列化不满足需求时,可以创建类型...
**自定义序列化和反序列化** Gson允许你自定义对象的序列化和反序列化过程。例如,如果你想在序列化时忽略某个字段,可以使用`@Expose`注解,并在构造Gson实例时指定只序列化暴露的字段: ```java @Expose(serialize...
3. **TypeAdapter和JsonSerializer/JsonDeserializer**: 这些是Gson的自定义序列化和反序列化机制。当你需要对特定类型进行特殊处理时,可以创建自定义的适配器。例如,如果你有一个复杂的日期对象,你可以编写一个`...
4. **自定义序列化和反序列化**:如果你需要对某些字段进行特殊处理,Gson允许你注册自定义的`TypeAdapter`,这样可以在转换过程中执行特定的操作。 5. **日期和时间处理**:默认情况下,Gson可能无法正确地处理...
2. **灵活性**: Gson支持自定义序列化和反序列化的逻辑,可以通过注解或自定义TypeAdapter实现。 3. **性能**: Gson设计高效,执行速度快,内存占用低,适用于大量数据处理的场景。 4. **易用性**: Gson的API简单...
对于一些复杂或特殊的类型转换,Gson提供了TypeAdapter接口,允许用户自定义数据的序列化和反序列化过程。这在处理自定义日期格式或者复杂的自定义类型时非常有用。 4. **注解支持** Gson 2.5版本中,支持了注解...
2. **JsonSerializer<T> 和 JsonDeserializer**: 这两个接口定义了自定义序列化和反序列化逻辑,允许用户针对特定类型定制JSON转换过程。 3. **GsonBuilder**: 提供了一系列的配置方法,如设置日期格式、注册自定义...