转载请出自出处:http://eksliang.iteye.com/blog/2175595
一.概述
Gson的TypeAapter可以理解成自定义序列化和返序列化
二、应用场景举例
例如我们通常去注册时(那些外国网站),会让我们输入firstName,lastName,但是转到我们都是国人吗,心想输入进去的fistName,lastName就要以userName:firtName-lastName的格式展现。
参考实例:
Entry实体,用于保存firtName、lastName
package com.ickes.json.daomain; public class Entry { private String firstName; private String lastName; public Entry(String firstName, String lastName) { super(); this.firstName = firstName; this.lastName = lastName; } get()和set()方法省略......! @Override public String toString() { return "Entry [firstName=" + firstName + ", lastName=" + lastName + "]"; } }
自定义EntrySerializer类实现 JsonSerializer、JsonDeserializer接口,用来自定义转换
JsonSerializer:序列化接口;
JsonDeserializer:反序列化接口;
EntrySerializer类代码如下:
package com.ickes.json; import java.lang.reflect.Type; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.ickes.json.daomain.Entry; /** * 自定义序列化和反序列化 * @author Ickes * */ public class EntrySerializer implements JsonSerializer<Entry>,JsonDeserializer<Entry>{ /** * 序列化时调用 */ @Override public JsonElement serialize(Entry entry, Type typeOfSrc, JsonSerializationContext context) { if(entry == null){ return null; } /* * 看下JsonElement类的实现类, * 他可以将entry转换为不同的类型例如数组,对象; * 我这里的需求是将firtName和lastName转换为firtName-lastName的格式,用下面这个实现类 */ JsonElement json = new JsonPrimitive(entry.getFirstName()+"-"+entry.getLastName()); return json; } /** * 反序列化时调用 */ @Override public Entry deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String[] names=json.toString().split("-"); String firstName=names[0]; String lastName=names[1]; Entry entry = new Entry(firstName, lastName); return entry; } }
测试代码如下:
package com.ickes.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.ickes.json.daomain.Entry; import com.ickes.json.daomain.User; public class EntrySerializerTest { public static void main(String[] args) { GsonBuilder gsonBuilder = new GsonBuilder(); //注册适配器 gsonBuilder.registerTypeAdapter(Entry.class,new EntrySerializer()) .setPrettyPrinting();//对结果格式化一下 Gson gson = gsonBuilder.create(); //我们去注册时,通常名字由两部分组成,fistName,lastName Entry entry = new Entry("xia","liang"); User user = new User(); user.setUserName(entry); user.setUserPwd("xl123"); user.setAge(24); //序列化 String json = gson.toJson(user); System.out.println("序列化结果:\n"+json); //反序列化 user=gson.fromJson(json,User.class); System.out.println("反序列化结果:\n"+user); } }
返回结果如下:
序列化结果: { "userName": "xia-liang", "userPwd": "xl123", "age": 24 } 反序列化结果: User [userName=Entry [firstName="xia, lastName=liang"], userPwd=xl123, age=24]
相关推荐
在这个`Gson TypeAdapter`使用技巧的例子中,我们将深入探讨如何利用TypeAdapter来优化数据处理,包括数据免判空、解析后校验以及预处理等关键环节。这些技巧对于处理机器学习中的数据预处理尤其重要。 首先,让...
这个"Android Gson使用实例Demo"旨在帮助开发者理解如何在Android应用中有效地使用Gson库来解析和生成JSON。 Gson的核心功能在于将Java对象转换为对应的JSON字符串,以及将JSON字符串反序列化为Java对象。在Android...
kson:用于Kotlin数据类的Gson TypeAdapter和Factory生成器
你可以创建一个TypeAdapter,并通过GsonBuilder注册它,这样Gson在序列化或反序列化时会使用这个自定义的转换逻辑。 4. **注解(Annotations)**:Gson支持使用注解来控制序列化和反序列化的行为。例如,`@Expose`...
包含以下java源文件: ...com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class ...
对于一些复杂或特殊的类型转换,Gson提供了TypeAdapter接口,允许用户自定义数据的序列化和反序列化过程。这在处理自定义日期格式或者复杂的自定义类型时非常有用。 4. **注解支持** Gson 2.5版本中,支持了注解...
4. **类型适配器**: Gson的`TypeAdapter`可以进一步定制序列化和反序列化的行为,对于复杂的对象模型或者特定需求的序列化很有用。 5. **字段忽略**: 使用`@Expose`注解可以指定哪些字段应该被序列化或反序列化,...
- 类型转换:Gson默认能处理基本数据类型和String,对于复杂的数据结构(如自定义对象、数组和集合),需要使用注解(如`@Expose`)或自定义`TypeAdapter`来指导序列化和反序列化。 - JSON命名策略:Gson支持多种...
4. **自定义序列化和反序列化**:通过实现Gson的TypeAdapter或JsonSerializer、JsonDeserializer接口,可以自定义对象的序列化和反序列化规则。 5. **配置Gson**:GsonBuilder类提供了丰富的配置选项,如设置日期...
8. **Maven依赖**:对于使用Maven构建项目的开发者,可以在pom.xml文件中添加Gson的依赖,以便在项目中使用。依赖地址通常可以在Maven仓库或官方文档中找到。 9. **性能优化**:Gson 2.8.2版本对内部实现进行了优化...
这个“我的gson学习例子”显然是一份关于如何使用Gson进行JSON操作的学习资料。下面我们将详细探讨Gson库的使用方法和相关知识点。 首先,我们要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...
3. **类型适配器(TypeAdapter)**:Gson允许自定义数据类型的序列化和反序列化过程,通过实现`TypeAdapter`接口,可以对特定类型的数据进行特殊处理。 4. **字段命名策略**:Gson支持不同的字段命名策略,比如保持...
在Java开发中,Maven项目广泛使用,而Gson库是...同时,Gson还提供了其他高级特性,如类型适配器(TypeAdapter)、字段忽略策略等,以满足更复杂的转换需求。在实际开发中,根据项目的具体需求,可以灵活运用这些功能。
这个资源显然提供了一系列关于如何使用Gson进行JSON处理的例子,使得开发者能够轻松理解和应用Gson的功能。 1. **Gson库介绍** Gson是Google提供的一个开源库,它提供了丰富的API来处理JSON数据。它允许我们把Java...
通过创建`TypeAdapter`或使用注解,我们可以定制Gson的行为以适应特定的需求。 总的来说,Gson作为Java中强大的JSON处理库,极大地简化了JSON数据与Java对象之间的转换。无论面对简单的键值对还是复杂的JSON结构,...
4. **类型适配器(TypeAdapter)**:Gson允许用户自定义类型适配器,以处理特定类型的序列化和反序列化逻辑,特别是对于复杂或者自定义的Java类型。 5. **字段注解(Field Annotations)**:Gson支持通过在Java字段...
在本实例中,我们将深入探讨Gson库的使用方法,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。 首先,我们需要在项目中引入Gson库。如果你使用的是Maven,可以在pom.xml文件...
然而,在使用Gson库进行JSON序列化和反序列化时,枚举处理默认方式可能无法满足所有需求。本篇文章将详细探讨如何通过自定义Gson适配器实现枚举类型的统一序列化和反序列化处理,无需预先定义枚举,也无需修改Gson...
4. **字段注解**:Gson支持使用Java注解来控制哪些字段被序列化或反序列化,例如`@Expose`用于指定字段可见性,`@SerializedName`用于指定JSON字段名。 5. **流处理**:Gson提供了`JsonWriter`和`JsonReader`,可以...
- **类型适配器**:如果你需要更精细的控制转换过程,可以实现`TypeAdapter`接口,Gson会使用这些适配器进行特定类型的转换。 - **运行时类型信息**:Gson可以处理运行时的类型信息,允许将JSON转换为未知类型。 - *...