1. Gson使用其内置适配器执行对象的序列化/反序列化。它还支持自定义适配器。我们将讨论如何创建自定义适配器以及如何使用它。

2. 创建自定义适配器

2.1. 通过扩展TypeAdapter类并将其传递给目标对象的类型来创建自定义适配器。重写读取和写入方法以分别执行自定义反序列化和序列化。

class StudentAdapter extends TypeAdapter<Student> {@Overridepublic Student read(JsonReader reader) throws IOException {...}@Overridepublic void write(JsonWriter writer, Student student) throws IOException {}
}

3. 注册自定义适配器

3.1. 使用GsonBuilder注册自定义适配器和使用创造GSON实例GsonBuilder。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
Gson gson = builder.create();

4. 使用适配器

4.1. Gson现在将使用自定义适配器将Json文本转换为对象, 反之亦然。

String jsonString = "{\"id\":1, \"name\":\"张三\"}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);

5. 例子

5.1. 新建一个名为GsonAdapter的Java项目, 同时添加相关jar包。

5.2. 新建Student.java

package com.fj.a;public class Student {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString() {return "Student [id = " + id + ", name = " + name + "]";}
}

5.3. 新建StudentAdapter.java

package com.fj.a;import java.io.IOException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;class StudentAdapter extends TypeAdapter<Student> {@Overridepublic Student read(JsonReader reader) throws IOException {Student student = new Student();reader.beginObject();String fieldname = null;while (reader.hasNext()) {JsonToken token = reader.peek();if (token.equals(JsonToken.NAME)) {fieldname = reader.nextName();}if ("id".equals(fieldname)) {token = reader.peek();student.setId(reader.nextInt());}if ("name".equals(fieldname)) {token = reader.peek();student.setName(reader.nextString());}}reader.endObject();return student;}@Overridepublic void write(JsonWriter writer, Student student) throws IOException {writer.beginObject();writer.name("id");writer.value(student.getId());writer.name("name");writer.value(student.getName());writer.endObject();}
}

5.4. 新建App.java

package com.fj.a;import com.google.gson.Gson;
import com.google.gson.GsonBuilder;public class App {public static void main(String args[]) {GsonBuilder builder = new GsonBuilder();builder.registerTypeAdapter(Student.class, new StudentAdapter());builder.setPrettyPrinting();Gson gson = builder.create();String jsonString = "{\"id\":1, \"name\":\"张三\"}";Student student = gson.fromJson(jsonString, Student.class);System.out.println(student);jsonString = gson.toJson(student);System.out.println(jsonString);}
}

5.5. 运行App.java

006_Gson定制型适配器相关推荐

  1. 学习状态通道,Part-2:App 定制型状态通道

    Part-1:支付通道 注:我决定改变这个系列的名称,把重点放在状态通道,而不是 Counterfactual 上,以便我们能够涵盖状态通道中所有的工作,而且不会将这两个概念混为一谈. 在我们开始之前 ...

  2. 定制型的OA系统要了解一下吗?

    前言:随着无纸化办公的广泛应用,OA办公系统在企业里扮演的角色尤为重要,对企业上下大小决策提供了重要数据支持,与传统纸上办公相比,提高了企业运营效率.正因为这样,为了迎合市场的需求,市面的有五花八门的 ...

  3. 1分钟制作反映情绪的定制型沐浴膏,爱茉莉太平洋再获CES创新奖

    韩国首尔2021年11月11日 /美通社/ -- 爱茉莉太平洋研发的顾客定制型技术"Mind-linked Bathbot"和"Myskin Recovery Platf ...

  4. TFN 雷达信号模拟器可定制型

    市面上现有雷达信号模拟器频段无法满足训练和教学要求怎么办.与其继续找,不如定制一台. 系统介绍 RMD型雷达信号模拟器是为满足我军电子战侦察装备日常检查和试验而研制的一款多用途雷达训练设备,其具有信号 ...

  5. Java(JavaEE)学习线路图

    Java学习线路图 Java教程 Java 教程 Java 简介 Java 开发环境配置 Java 基础语法 Java 对象和类 Java 基本数据类型 Java变量类型 Java修饰符 Java运算 ...

  6. 高端网站建设css3动画响应式模板_网站建设中整站定制与模板建站存在着什么差异...

    公司要在互联网上面有强大的竞争能力,殊不知模板建站是会给你感觉不尽如人意.而整站定制的企业网站不论是竞争能力還是客户体验都能够考虑公司的一切要求.下边网站建设企业我就带大伙儿剖析一下,针对整站定制而言 ...

  7. 【effective c++读书笔记】【第8章】定制new和delete(2)

    条款50:了解new和delete的合理替换时机 有人会想要替换掉编译器提供的operator new或operator delete,以下是几个理由: a.用来检测运用上的错误.编程过程中会出现各种 ...

  8. vue企业网站模板_模板网站VS定制网站,企业如何选择?

    步入互联网时代,企业需要建设属于自己的网站,网站建设到底是选择模板网站,还是定制网站呢?笔者接下来跟大家详细分析一下. 网站建设的类型 一.网站建设的类型 模板网站 模板型网站是用已经成形的网站为框架 ...

  9. visual studio可以开发app吗_做好APP定制开发的计划,可以让你的应用开发事半功倍...

    点击蓝字 关注我们 站在专业开发的角度来说,做好APP定制开发的计划是成功研发一款APP应用软件的首要任务.可以说只有计划越详细,APP开发的过程才会越顺利.而做好APP定制开发的计划,则需要从以下几 ...

最新文章

  1. 码教授告诉你人工智能如今涉及的领域你无法想象
  2. linux 变量获取问题,有关read命令从管道输出读取变量参数的问题
  3. 有关BST搜索树转换为AVL高度平衡树的旋转问题
  4. Python pip更换升级源
  5. 数据结构实验六 综合数据处理
  6. vba九九乘法表代码_VBA代码模块化--数据透视表
  7. vue php tree,Vue 实现树形视图数据功能
  8. Linux下载安装zookeeper
  9. JavaScript:Array属性方法
  10. bootstrap学习笔记(2)表单设计
  11. 《Kotlin项目实战开发》第1章 Kotlin是什么 1
  12. python 绘制并列条形图并添加数据标签
  13. C语言实现一个简单的矩阵运算器
  14. win10系统安装sql不上服务器,win10安装sql2000没有反应怎么办_win10安装不了sql2000的解决方法...
  15. win11假死没反应怎么办 windows11假死没反应的解决方法
  16. 滴滴章文嵩:我们比AlphaGo面临的问题要复杂很多很多倍
  17. 页面里的在线实时聊天实现
  18. 我的第一个工程-一个台球游戏
  19. NLTK使用教程(持续更新ing...)
  20. 几款免费ssh客户端软件--替代xshell选型

热门文章

  1. 《Swift开发实战》——第16章,第16.2节下标脚本用法
  2. Git学习笔记03--git reset
  3. 2016.9.9《Oracle查询优化改写技巧与案例》电子工业出版社一书中的技巧
  4. svn: E215004: Authentication failed
  5. ASP.NET自定义错误页面(转)
  6. 使用curl获取Location:重定向后url
  7. apache 虚拟主机如何配置
  8. 200m的共享虚拟主机够用吗
  9. 软体定义网路(SDN)的多重意义
  10. 基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署