Android框架-Google官方Gson解析,android开发实验报告总结

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 1个月
简介: Android框架-Google官方Gson解析,android开发实验报告总结

Gson 库中的注解:有五种注解

![](https://ucc.alicdn.com/images/user-upload-01/img_convert/ab3c59f391d986328e998c14e5752e5a.webp?x-oss-process=image/format,png)

1、首先着重的先说明重命名注解: SerializedName

**注解的作用:**转换 key 关键字,json 转换成对象是,json 字段的 key 默认必须和声明类的字段名称一样。但是如果服务器返回的数据中 key 是关键字,这该怎么办?例如 key 是 case、switch 等,我们在声明类的时候是不能用这些字段的。或许你会让服务端那边改动,那服务端可能要改动非常的大,但是实际情况是不太愿意去改的。而这时候重命名注解就派上用场了。

还有就是如果服务端返回的 json 的 key 太冗余、或是不直观,这是就可以简化一下,代码看起来比较的优雅。

#####替换关键字的 key:
public class AnnotationTest {      public class Person {          private int per_id;          private String name;          private String sex;          @SerializedName(“case”)          private int case_num;          public Person(int per_id, String name, String sex, int case_num) {              super();              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.case_num = case_num;          }          @Override          public String toString() {              return “Person–>[per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, case_num=” + case_num + “]”;          }      }      public static void main(String[] args) {          Gson gson = new Gson();          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“case”:18}”;          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“服务端发送的情况:”+json_str);          System.out.println(“移动端转换的情况:”+person);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/14553d2032677b77411c1809258ab912.webp?x-oss-process=image/format,png)
替换冗余、难看的 key:
public class AnnotationTest1 {      public class Person {          private int per_id;          private String name;          private String sex;          @SerializedName(“home_light_state”)          private boolean state;          public Person(int per_id, String name, String sex, boolean state) {              super();              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person [per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) {          Gson gson = new Gson();          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“home_light_state”:true}”;          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“服务端发送的情况:”+json_str);          System.out.println(“移动端转换的情况:”+person);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/41ad8bf66a65d934c37ffabb3992555f.webp?x-oss-process=image/format,png)
**注解作用2:**结合 alternate 提供多种备用字段key来解析,@SerializedName(value = “state”, alternate = { “plus”, “all” })
如果 json 中有 plus 就会解析成 state,如果有 all 也会解析成 state,当然
state 依旧不变的。
**注意1:**value 中的值不能出现在 alternate 中;
**注意2:**alternate 的备选字段会后面的替换前面的。
#####实例代码:
public class AnnotationTest2 {      public class Person {          private int per_id;          private String name;          private String sex;          @SerializedName(value = “state”, alternate = { “plus”, “all” })          private String state;          public Person(int per_id, String name, String sex, String state) {              super();              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person [per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) {          Gson gson = new Gson();          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“all”:“广东广州”}”;          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“服务端发送:”+json_str);          System.out.println(“转换成:” + person);          System.out.println(““);          String json_str1 = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“plus”:“广东广州”}”;          Person person1 = gson.fromJson(json_str1, Person.class);          System.out.println(“服务端发送:”+json_str1);          System.out.println(“转换成:” + person1);          System.out.println(””);          //all在state之后,所以all会解析成state,值则是all的原先的值          String json_str2 = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“state”:“state广东广州”,“all”:“all广东广州”}”;          Person person2 = gson.fromJson(json_str2, Person.class);          System.out.println(“服务端发送:”+json_str2);          System.out.println(“转换成:” + person2);          System.out.println(““);          //state在最后,不用解析,解析后的值也是state原先的          String json_str3 = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“plus”:“plus广东广州”,“state”:“all广东广州”}”;          Person person3 = gson.fromJson(json_str3, Person.class);          System.out.println(“服务端发送:”+json_str3);          System.out.println(“转换成:” + person3);          System.out.println(””);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/e150bcc4447cc6f9763236867a276eba.webp?x-oss-process=image/format,png)
2、过滤注解:Expose

源码:默认既可序列化又可反序列化

@Retention(RetentionPolicy.RUNTIME)  @Target(ElementType.FIELD)  public @interface Expose {    public boolean serialize() default true;    public boolean deserialize() default true;  }
可以排除不需要序列化的字段,需要配合 GsonBuilder 使用
Gson gson = new GsonBuilder()                  .excludeFieldsWithoutExposeAnnotation()                  .create();

不添加 @Expose 注解的字段将不会解析,分为以下几种情况:

**1、**不添加 @Expose 注解等同于 @Expose(deserialize = false,serialize = false) 不做任何解析

2、@Expose(deserialize = true,serialize = false) 只解析用用,也就是反序列化可以,序列化不可以

3、@Expose(deserialize = false,serialize = true) 序列化可以,反序列化不行

4、@Expose(deserialize = true,serialize = true) 既可以序列化,也可以反序列化

#####实例代码:

不添加 @Expose 注解等同于 @Expose(deserialize = false,serialize = false) 不做任何解析

public class ExposeTest {      public static class Person {          private int per_id;          private String name;          private String sex;          private boolean state;          public Person(int per_id, String name, String sex, boolean state) {              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person–>[per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) {          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“state”:true}”;          Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation()                  .create();          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“反序列化:” + person);          Person person1 = new Person(2, “layne”, “man”, true);          String json_str1 = gson.toJson(person1);          System.out.println(“序列化:”+json_str1);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/c82b6e35e7fc22f5a4a4f3bb67e386a0.webp?x-oss-process=image/format,png)
其余三种情况请查看原文
3、版本控制注解:Since、Util

Since 注解:Gson 实例配置 GsonBuilder.setVersion(n) 使用,当 n>=v 时,才会序列化解析

#####实例代码:

public class SinceTest {      public static class Person {           @Since(2)          private int per_id;           @Since(2)          private String name;           @Since(2)          private String sex;           @Since(2)          private boolean state;          public Person(int per_id, String name, String sex, boolean state) {              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person–>[per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) {          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“state”:true}”;          Gson gson = new GsonBuilder().setVersion(1)//版本为1                  .create();          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“反序列化v=1:” + person);          Person person1 = new Person(2, “layne”, “man”, true);          String json_str1 = gson.toJson(person1);          System.out.println(“序列化v=1:”+json_str1);          System.out.println(“=“);          Gson gson1 = new GsonBuilder().setVersion(2)//版本为2                  .create();          Person person2 = gson1.fromJson(json_str, Person.class);          System.out.println(“反序列化v=2:” + person2);          Person person3 = new Person(2, “layne”, “man”, true);          String json_str2 = gson1.toJson(person3);          System.out.println(“序列化v=2:”+json_str2);          System.out.println(”=”);          Gson gson2 = new GsonBuilder().setVersion(3)//版本为3                  .create();          Person person4 = gson2.fromJson(json_str, Person.class);          System.out.println(“反序列化v=3:” + person4);          Person person5 = new Person(2, “layne”, “man”, true);          String json_str3 = gson2.toJson(person5);          System.out.println(“序列化v=3:”+json_str3);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/2e59d4cd11297e9de65e1c0ef007ddd4.webp?x-oss-process=image/format,png)

Util 注解:Gson 实例配置 GsonBuilder.setVersion(n) 使用,当 n < v 时,才会序列化解析

#####实例代码:

public class UtilTest {      public static class Person {          @Until(2)          private int per_id;          @Until(2)          private String name;          @Until(2)          private String sex;          @Until(2)          private boolean state;          public Person(int per_id, String name, String sex, boolean state) {              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person–>[per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) {          String json_str = “{“per_id”:1,“name”:“layne”,“sex”:“man”,“state”:true}”;          Gson gson = new GsonBuilder().setVersion(1)// 版本为1                  .create();          Person person = gson.fromJson(json_str, Person.class);          System.out.println(“反序列化v=1:” + person);          Person person1 = new Person(2, “layne”, “man”, true);          String json_str1 = gson.toJson(person1);          System.out.println(“序列化v=1:” + json_str1);          System.out.println(“=“);          Gson gson1 = new GsonBuilder().setVersion(2)// 版本为2                  .create();          Person person2 = gson1.fromJson(json_str, Person.class);          System.out.println(“反序列化v=2:” + person2);          Person person3 = new Person(2, “layne”, “man”, true);          String json_str2 = gson1.toJson(person3);          System.out.println(“序列化v=2:” + json_str2);          System.out.println(”=”);          Gson gson2 = new GsonBuilder().setVersion(3)// 版本为3                  .create();          Person person4 = gson2.fromJson(json_str, Person.class);          System.out.println(“反序列化v=3:” + person4);          Person person5 = new Person(2, “layne”, “man”, true);          String json_str3 = gson2.toJson(person5);          System.out.println(“序列化v=3:” + json_str3);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/abc037b6da840c5a1f92d7111c0a5bfa.webp?x-oss-process=image/format,png)

Gson 还有一种更高级的手法进行序列化和反序列化,那就是 TypeAdapter ,就是就是对象 json 之间的互相转换 接替了T 泛型类的序列化和反序列化的逻辑,大家如果有兴趣可以去看一下源码,2.1版本之前后的用法是不一样的,2.1版本之前可以自定义 adapter,在2.1版本之后更推荐直接插入泛型就使用。在这里演示泛型的

代码演示:

public class TypeAdapterTest {      public static class Person {          private int per_id;          private String name;          private String sex;          private boolean state;          public Person(int per_id, String name, String sex, boolean state) {              this.per_id = per_id;              this.name = name;              this.sex = sex;              this.state = state;          }          @Override          public String toString() {              return “Person–>[per_id=” + per_id + “, name=” + name + “, sex=”                      + sex + “, state=” + state + “]”;          }      }      public static void main(String[] args) throws Exception {          Gson gson = new Gson();          TypeAdapter personTypeAdapter = gson.getAdapter(Person.class);          Person person = new Person(1, “layne”, “man”, true);          String json_str = personTypeAdapter.toJson(person);          System.out.println(“序列化结果:” + json_str);          Person person1 = personTypeAdapter.fromJson(json_str);          System.out.println(“反序列化结果:” + person1);      }  }
#####运行结果:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/4a2ad0c0b427e215f87bcc62d2ffd4e4.webp?x-oss-process=image/format,png)

接下来就是容错机制

为什么要容错了?

在 javaBean 中编号 per_id 声明的事 int 类,如果服务端返回的是""空字符串,那么客户端该怎么办?崩溃吗?

这时候就需要容错机制啦,容错的实现方式:


相关文章
|
11月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
694 27
|
11月前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
809 31
|
11月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
440 15
|
11月前
|
人工智能 小程序 前端开发
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。
|
11月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
11月前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
544 7
|
11月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离的开发模式中,API 调试的效率直接影响项目的质量和交付速度。通过本文的对比分析,我们可以看到无工具调试模式虽具备灵活性和代码复用能力,但在操作便利性和团队协作上稍显不足。而传统的外部调试工具带来了可视化、高效协作与扩展性,却可能存在工具切换带来的开发链路断层问题。Apipost-Hepler 融合了两者的优势,让开发者无需离开熟悉的 IDEA 环境,就能享受可视化调试工具的强大功能。
392 5
|
11月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
12月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
757 9
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。

推荐镜像

更多