`

gson中TypeAdapter实现自定义序列化操作

    博客分类:
  • gson
阅读更多

    最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 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));
	}
}

 

 

四、结果

 

  • 大小: 96.2 KB
分享到:
评论

相关推荐

    Gson 枚举类型的统一序列化/反序列化处理

    要实现自定义的枚举序列化和反序列化,我们需要创建一个继承自`Gson.TypeAdapter`的类。这个类需要重写`read()`和`write()`方法。`read()`方法负责将JSON解析为枚举值,而`write()`方法则将枚举值转化为JSON。下面是...

    Gson TypeAdapter使用技巧几例:数据免判空、解析后校验、预处理.zip

    TypeAdapter是Gson框架中用于自定义序列化和反序列化的组件,它可以让我们对JSON数据的转换过程进行更细粒度的控制。通过创建并注册一个TypeAdapter,我们可以定制JSON字符串到Java对象的转换规则,反之亦然。 **...

    gson源码与文档,集成多枚举类型统一序列化/反序列化处理

    针对枚举类型,我们可以创建一个自定义的`TypeAdapter`,以实现统一的序列化和反序列化逻辑。`TypeAdapter`是Gson框架的一部分,它可以自定义数据的读写方式。下面,我们将展示如何为多个枚举类型创建一个通用的`...

    GSON库源码文档

    类型适应器是GSON库中实现自定义序列化和反序列化的关键接口。通过实现`read()`和`write()`方法,可以处理自定义类型的JSON转换逻辑。 5. **字段注解** GSON提供了一系列注解来控制JSON序列化和反序列化的行为,...

    利用Google Gson实现JSON字符串和对象之间相互转换

    有时,JSON结构可能与Java对象不完全匹配,这时可以自定义序列化和反序列化的逻辑。Gson提供了`@JsonAdapter`注解以及自定义类型适配器(TypeAdapter)来实现这一功能。 ```java @JsonAdapter(MyCustomAdapter....

    gson-2.1源码

    通过对gson-2.1源码的学习,开发者不仅可以理解Gson的工作原理,还能掌握如何利用其强大的自定义序列化和反序列化功能,以满足各种复杂的JSON数据处理需求。这对于进行Android开发或者任何Java项目中的数据交换都是...

    Gson所需驱动

    Gson库还支持自定义序列化和反序列化的逻辑,通过注解或自定义类型适配器实现。例如,你可以使用`@Expose`注解来指定哪些字段应该被包含在JSON中,或者创建一个`TypeAdapter`来处理特定类型的转换。 在“Gson驱动”...

    gson—2.3.jar

    - **字段映射控制**:可以通过注解(@Expose)来控制哪些字段会被序列化或反序列化,或者自定义序列化和反序列化的过程。 - **复杂类型支持**:Gson支持包括数组、集合、Map、枚举、自定义类等多种复杂类型的数据结构...

    Gson的三个jar包

    你可以创建一个TypeAdapter,并通过GsonBuilder注册它,这样Gson在序列化或反序列化时会使用这个自定义的转换逻辑。 4. **注解(Annotations)**:Gson支持使用注解来控制序列化和反序列化的行为。例如,`@Expose`...

    Gson解析所需jar包

    此外,Gson还提供了一些高级特性,如`JsonParser`用于逐项解析JSON流,`JsonElement`表示JSON结构的抽象,以及`TypeAdapter`和`GsonBuilder`用于自定义序列化和反序列化过程。 在实际应用中,Gson因其简洁的API和高...

    GSON源码完整版

    4. **自定义序列化和反序列化**: 用户可以通过实现`JsonSerializer`和`JsonDeserializer`接口来自定义特定类型的数据转换逻辑。 在GSON的源码中,关键类包括: - `GsonBuilder`: 用于构建自定义配置的`Gson`实例。...

    gson-2.8.6.zip

    4. **类型适配器(TypeAdapter)**:Gson允许用户自定义类型适配器,以处理特定类型的序列化和反序列化逻辑,特别是对于复杂或者自定义的Java类型。 5. **字段注解(Field Annotations)**:Gson支持通过在Java字段...

    google gson包json格式化

    Gson可以轻松地处理Java集合(如List、Set、Map)和数组的序列化和反序列化。 6. **日期格式化** 可以通过自定义`JsonSerializer`和`JsonDeserializer`来处理日期格式。 7. **自定义异常处理** 可以捕获并...

    GSON跨平台传输对Demo

    - **自定义序列化和反序列化**:你可以通过实现`JsonSerializer`和`JsonDeserializer`接口来自定义特定类型的转换逻辑。 - **类型适配器(TypeAdapter)**:当默认的序列化和反序列化不满足需求时,可以创建类型...

    Gson解析JSON数据的入门级源码

    **自定义序列化和反序列化** Gson允许你自定义对象的序列化和反序列化过程。例如,如果你想在序列化时忽略某个字段,可以使用`@Expose`注解,并在构造Gson实例时指定只序列化暴露的字段: ```java @Expose(serialize...

    gson最新源码

    3. **TypeAdapter和JsonSerializer/JsonDeserializer**: 这些是Gson的自定义序列化和反序列化机制。当你需要对特定类型进行特殊处理时,可以创建自定义的适配器。例如,如果你有一个复杂的日期对象,你可以编写一个`...

    Gson解析JSON的jar包

    4. **自定义序列化和反序列化**:如果你需要对某些字段进行特殊处理,Gson允许你注册自定义的`TypeAdapter`,这样可以在转换过程中执行特定的操作。 5. **日期和时间处理**:默认情况下,Gson可能无法正确地处理...

    java的gson-2.2.1.jar包

    2. **灵活性**: Gson支持自定义序列化和反序列化的逻辑,可以通过注解或自定义TypeAdapter实现。 3. **性能**: Gson设计高效,执行速度快,内存占用低,适用于大量数据处理的场景。 4. **易用性**: Gson的API简单...

    gson-2.5.jar

    对于一些复杂或特殊的类型转换,Gson提供了TypeAdapter接口,允许用户自定义数据的序列化和反序列化过程。这在处理自定义日期格式或者复杂的自定义类型时非常有用。 4. **注解支持** Gson 2.5版本中,支持了注解...

    gson源码.rar

    2. **JsonSerializer&lt;T&gt; 和 JsonDeserializer**: 这两个接口定义了自定义序列化和反序列化逻辑,允许用户针对特定类型定制JSON转换过程。 3. **GsonBuilder**: 提供了一系列的配置方法,如设置日期格式、注册自定义...

Global site tag (gtag.js) - Google Analytics