Gson使用方法详解
一、概述
Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛,所以非常有必要对其进行系统的学习。
json是一种数据格式,确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。
目前大多数的网络通讯格式已经从xml替换为json格式。
其提供了序列化和反序列化的功能。在我们进行网络开发的过程中通常会把参数封装成json格式传给后台,后台解析后的返回结果也会封装成json格式返回给调用者。
下面就针对json的用法做一下详细的描述。ps:重要。在查看第三方库的源代码或者自己封装库的时候尤其重要。对json不熟悉是无法封装成基于json的高质量库的。
例如:Retrofit的网络数据转换的converter。GsonConverterFactory.create()
二、从小例子入手
ps:Book.java
下面用到的所有实体都是基于Book.java类的。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.yw.gsonlib; import com.google.gson.annotations.SerializedName; /** * create by yangwei * on 2020-02-21 18:08 */ public class Book { public Book(){} private String id; /** * 加上@SerializedName注解后服务端api返回name、bookName、Name、bn时,客户端都能够拿到正确的值给name属性。 */ @SerializedName (value = "bookName" ,alternate = { "Name" , "bn" }) private String name; public Book(String id, String name) { this .id = id; this .name = name; } public String getId() { return id; } public void setId(String id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } } |
1.如何创建一个Gson对象
1 2 3 4 5 6 7 8 9 10 11 | /** * 创建Gson对象的两种形式 */ private void createGsonObject() { //第一种方式 Gson gson = new Gson(); //第二种方式 Gson gson1 = new GsonBuilder().create(); //方式二除了可以创建一个Gson对象以外还可以进行多项配置,例如,设置日期的格式化 // 例如: new GsonBuilder().setDateFormat("yyyy-MM-dd"); } |
2.如何创建一个JsonObject
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * 如何创建一个json对象 */ private void createJsonObject() { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty( "id" , "1" ); //给jsonObject创建一个id属性值为1 jsonObject.addProperty( "bookName" , "《深入Java虚拟机》" ); jsonObject.addProperty( "bookPrice" , 36.8 ); jsonObject.addProperty( "bookColor" , "红色" ); //打印Json字符串 System.out.println(jsonObject.toString()); //给JsonObject添加对象 JsonObject jsonObject1 = new JsonObject(); jsonObject1.addProperty( "chapterId" , "1" ); jsonObject1.addProperty( "chapterName" , "第一章" ); //给JsonObject添加实体对象 jsonObject.add( "chapter" , jsonObject1); System.out.println(jsonObject.toString()); } |
3.数组的序列化与反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * 根据一个json创建一个数组 */ private void createJsonArray() { //把数组转换为Json字符串 String[] args = new String[]{ "《深入Java虚拟机》" , "《Android插件编程》" , "《OpenCV全解》" }; Gson gson = new Gson(); String jsonStr = gson.toJson(args); //先创建一个Json字符串 System.out.println(jsonStr); //输出 //把Json字符串转换为Json数组 String[] strArray = gson.fromJson(jsonStr, String[]. class ); for (String s : strArray) { System.out.println(s); } } |
4.List的序列化与反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 根据一个json创建一个list */ private void createJsonToList() { //将list集合转换为json字符串 List<Book> books = new ArrayList<>(); books.add( new Book( "1" , "《深入Java虚拟机》" )); books.add( new Book( "2" , "《OpenCV进阶》" )); books.add( new Book( "3" , "《深入Android源代码》" )); Gson gson = new Gson(); String jsonListStr = gson.toJson(books); System.out.println(jsonListStr); //将json字符串转换为list集合 //获取泛型的类型 Type type = new TypeToken<List<Book>>() { }.getType(); //使用gson将字符串转换为泛型集合,即List<Book> List<Book> books1 = gson.fromJson(jsonListStr, type); for (Book book : books1) { System.out.println(book.getName()); } } |
5.序列化与反序列化综合例子(基于Book对象)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * json的序列化与反序列化 * 使用toJson实现序列化,使用fromJson实现反序列化 */ private void jsonSeriaReSeria() { Gson gson = new Gson(); Book book = new Book( "1" , "《深入Java虚拟机》" ); //将book类序列化成字符串 String bookStr = gson.toJson(book); System.out.println(bookStr); //将bookStr反序列化成为Book类 Book b = gson.fromJson(bookStr, Book. class ); System.out.println(b.getName()); } |
6.如何为属性做兼容性处理(重命名、预设名称等)
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 如何给json属性重命名 * 假设我们有这样一个需求:由于接口改版,从服务端返回的api中的book字段的name属性,变为了bookName。如果我们 * 仍然用name进行解析,则接不到bookName的值,而由于服务端没有返回name,则解析后name=null。如果要考虑到兼容性那么我们的的Book类的属性就 * 需要做一下兼容性的处理。 * 使用@SerializedName可以给属性重命名。用@SerializedName的alternate属性给Book的属性做扩展 */ private void reNameProperty() { String bookJson = "{\"id\":\"1\",\"bookName\":\"《深入Java虚拟机》\"}" ; Gson gson = new Gson(); Book book = gson.fromJson(bookJson, Book. class ); System.out.println(book.getName()); } |
7.GsonBuilder的一些基础配置
1 2 3 4 5 6 7 8 9 10 | /** * 对GsonBuilder一些属性介绍 */ private void gsonBuilderProperty() { Gson gson = new GsonBuilder() .serializeNulls() //默认情况下如果某一个属性为null,那么此属性不会参与序列化和反序列化的过程,加上此属性后会参与序列化和反序列化的过程 .setPrettyPrinting() //格式化json字符串的输出,默认情况下是输出一行,经过这个属性设置后会格式化输出,即有缩进的输出 .setDateFormat( "yyyy-MM-dd HH:mm:ss" ) //对时间进行格式化 .create(); } |
8.TypeAdapter使用方法介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * typeAdapter的使用方法 * TypeAdapter是一个泛型抽象类,用于接管某种类型的序列化和反序列化的过程 * 它包含两个抽象方法write和read,分别用于自定义的序列化和反序列化的过程 */ private void useTypeAdapter() { Gson gson = new GsonBuilder().registerTypeAdapter(Book. class , new BookTypeAdapter()).create(); Book book = new Book( "1" , "深入Java虚拟机" ); System.out.println(gson.toJson(book)); String bookJson = "{\"Id\":\"1\",\"Name\":\"《深入Java虚拟机》\"}" ; Book book1 = gson.fromJson(bookJson,Book. class ); System.out.println(gson.toJson(book1)); } |
以下是BookTypeAdapter的代码介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package com.yw.gsonlib; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; /** * create by yangwei * on 2020-02-23 15:12 */ public class BookTypeAdapter extends TypeAdapter<Book> { /** * 序列化接口 * * @param jsonWriter * @param book * @throws IOException */ @Override public void write(JsonWriter jsonWriter, Book book) throws IOException { //流式序列化对象开始 jsonWriter.beginObject(); //将Json的key值都指定为首字母大写 jsonWriter.name( "Id" ).value(book.getId()); jsonWriter.name( "Name" ).value(book.getName()); //流式序列化对象结束 jsonWriter.endObject(); } /** * 反序列化接口 * * @param jsonReader * @return * @throws IOException */ @Override public Book read(JsonReader jsonReader) throws IOException { Book book = new Book(); //流式反序列化开始 jsonReader.beginObject(); while (jsonReader.hasNext()) { switch (jsonReader.nextName()) { case "id" : case "Id" : book.setId(jsonReader.nextString()); break ; case "name" : case "Name" : book.setName(jsonReader.nextString()); break ; } } //流式反序列化结束 jsonReader.endObject(); return book; } } |
三、总结
讲到这里gson的内容基本上就讲完了,相信小伙伴们对gson已经有了一个全面的了解。主要要清楚:如何序列化与反序列化,如何自定义序列化过程、如何更改属性,如何创建对象、如何对泛型进行序列化与反序列化。
ps:由于后面会讲到Retrofit2的数据转换工厂的实现方式(GsonConverterFactory.create()),对于基础比较薄弱的开发者来说补充一下Gson相关知识,再接着看Retrofit2的转换工厂的实现原理会非常的清晰。
另外下一节将介绍自定义泛型,gons和自定义泛型了解清楚后再去看源代码的实现流程,你会发现根本不需要动脑子,一看就明白了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探