Google Gson:TypeAdapter
来源:互联网 发布:厦门淘宝美工培训学费 编辑:程序博客网 时间:2024/06/06 07:00
本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。
TypeAdapter 是 Gson 2.0 开始的一个抽象类,用于接管某种类型的序列化和反序列化过程
TypeAdapter 的两个主要方法
public abstract class TypeAdapter<T> { public abstract void write(JsonWriter out, T value) throws IOException; public abstract T read(JsonReader in) throws IOException;}
示例
(1) POJO
public class User { private String name; private String phoneNumber; public User() {} public User(String name, String phoneNumber) { this.name = name; this.phoneNumber = phoneNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } @Override public String toString() { return "User [name=" + name + ", phoneNumber=" + phoneNumber + "]"; }}
(2) TypeAdapter 接口类
class UserTypeAdapter extends TypeAdapter<User> { @Override public User read(JsonReader reader) throws IOException { User user = new User(); reader.beginObject(); while (reader.hasNext()) { switch (reader.nextName()) { case "name": case "custom-name": case "adapter-name": user.setName(reader.nextString()); break; case "phone": case "custom-phone": case "adapter-phone": user.setPhoneNumber(reader.nextString()); break; default: break; } } reader.endObject(); return user; } @Override public void write(JsonWriter writer, User user) throws IOException { writer.beginObject(); writer.name("adapter-name").value(user.getName()); writer.name("adapter-phone").value(user.getPhoneNumber()); writer.endObject(); }}
(3) 测试代码
@Testpublic void test() throws IOException { User user = new User("UserX", "160"); Gson gson = new GsonBuilder() .registerTypeAdapter(User.class, new UserTypeAdapter()) .create(); System.out.println(gson.toJson(user)); String userStr = "{\"name\":\"Name\",\"phone\":\"151\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"custom-name\":\"CustomName\",\"custom-phone\":\"152\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"adapter-name\":\"AdapterName\",\"adapter-phone\":\"153\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"name\":\"nameX\",\"adapter-phone\":\"154\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"adapter-name\":\"nameY\",\"phone\":\"155\"}"; System.out.println(gson.fromJson(userStr, User.class));}
测试结果:
Gson 还提供了一个类注解 @JsonAdapter,如果使用此注释则每次生成 Gson 对象时不用再注册类型适配器,即不用再调用 GsonBuilder.registerTypeAdapter
示例
更新 POJO
@JsonAdapter(UserTypeAdapter.class)public class User { private String name; private String phoneNumber; public User() {} public User(String name, String phoneNumber) { this.name = name; this.phoneNumber = phoneNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } @Override public String toString() { return "User [name=" + name + ", phoneNumber=" + phoneNumber + "]"; }}
测试代码:
@Testpublic void test() throws IOException { User user = new User("UserX", "160"); Gson gson = new Gson(); System.out.println(gson.toJson(user)); String userStr = "{\"name\":\"Name\",\"phone\":\"151\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"custom-name\":\"CustomName\",\"custom-phone\":\"152\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"adapter-name\":\"AdapterName\",\"adapter-phone\":\"153\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"name\":\"nameX\",\"adapter-phone\":\"154\"}"; System.out.println(gson.fromJson(userStr, User.class)); userStr = "{\"adapter-name\":\"nameY\",\"phone\":\"155\"}"; System.out.println(gson.fromJson(userStr, User.class));}
运行结果:
0 0
- Google Gson:TypeAdapter
- GSON: TypeAdapter
- gson-typeadapter
- Gson 自定义TypeAdapter
- Gson使用四(TypeAdapter)
- GSON的TypeAdapter系列用法
- Gson注册TypeAdapter及处理Enum类型
- Gson 基础教程 —— 自定义类型适配器(TypeAdapter)
- Gson之TypeAdapter的工作原理分析(1)
- Gson-----9、注册TypeAdapter及处理Enum类型
- Json转换利器Gson三、TypeAdapter的使用
- com.google.gson.Gson;
- Google Gson
- google-gson
- google-Gson
- Google-Gson
- google Gson
- Json转换利器Gson之实例六-注册TypeAdapter及处理Enum类型
- ExtJS4 中 setValue和getValue 的问题
- android 开发三星,小米手机datepicker日期控件onDateSet回调不执行解决方法
- java.io.CharConversionException: isHexDigit
- 获取系统响铃、震动信息及设置通知的震动与响铃
- 六、Android分多个dex
- Google Gson:TypeAdapter
- javascript中文比较方法——localeCompare() 方法
- 将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy
- NSString 剪切一个字符串 deleteCharactersInRange
- Java数据结构和算法(一)——开篇
- 利用crontab计划配置备份
- 简体 “” iconv("GBK", "UTF-8") 失败
- 将ReactNative项目整合到android项目中步骤
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)