转载请出自出处: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]
相关推荐
包含以下java源文件: ...com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class ...
人工智能-机器学习-数据预处理
kson:用于Kotlin数据类的Gson TypeAdapter和Factory生成器
Json转换利器Gson之实例四-Map处理(下) (http://blog.csdn.net/lk_blog/article/details/7685224) Json转换利器Gson之实例五-实际开发中的特殊需求处理 (http://blog.csdn.net/lk_blog/article/details/7685237) ...
主要目标是使用TypeAdapter和TypeAdapterFactory实例扩展Gson以支持更多功能。 特征 所有功能都可以通过GsonFireBuilder进行访问。 此类将在内部GsonBuilder具有所有所需功能的GsonBuilder ,从中可以获取Gson实例...
Stag Stag通过为模型对象自动生成无反射TypeAdapter来提高Gson性能。 为什么要建造雄鹿? Gson是必不可少的JSON解析库。 它通过自动为模型对象生成无反射TypeAdapter来大大简化Stag Stag改善Gson性能。 为什么要建造...
java 工具包, async-...com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class ...
只需在您的项目中包括auto-value-gson,然后将一个公共静态方法添加到您的@AutoValue注释类中即可返回TypeAdapter。 您也可以使用@SerializedName注释属性,以定义反序列化的备用名称。 @AutoValue public abstract...
主要介绍了使用GSON库转换Java对象为JSON对象的进阶实例详解,包括注册TypeAdapter及处理Enum类型等实际运用中可能遇到的一些复杂问题,需要的朋友可以参考下
Stag Stag improves Gson performance by automatically generating reflection-less TypeAdapters for your model ...You can work around this by writing a custom TypeAdapter, a class that Gson uses to (de)se
对于JSON解析,使用自定义的 TypeAdapter。 用于使Country对象成为 。 此外, 用于依赖项注入。 该应用程序的目的是演示如何:Dagger 2可以与不同的示波器一起使用该项目也可以用作新应用程序的模板。 签出模板分支...