千家信息网

Java中Gson怎么用

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要为大家展示了"Java中Gson怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中Gson怎么用"这篇文章吧。JSON 是一种文本
千家信息网最后更新 2025年11月09日Java中Gson怎么用

这篇文章主要为大家展示了"Java中Gson怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中Gson怎么用"这篇文章吧。

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等

一、Gson的基本用法

Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法

(1)基本数据类型的解析

Gson gson = new Gson();int i = gson.fromJson("100", int.class); //100double d = gson.fromJson("\"99.99\"", double.class); //99.99boolean b = gson.fromJson("true", boolean.class); // trueString str = gson.fromJson("String", String.class); // String

(2)基本数据类型的生成 

Gson gson = new Gson();String jsonNumber = gson.toJson(100); // 100String jsonBoolean = gson.toJson(false); // falseString jsonString = gson.toJson("String"); //"String"

(3)POJO类的生成与解析

public class User { //省略其它 public String name; public int age; public String emailAddress;}

生成JSON: 

Gson gson = new Gson();User user = new User("张三",24);String jsonObject = gson.toJson(user); // {"name":"张三kidou","age":24}

解析JSON: 

Gson gson = new Gson();String jsonString = "{\"name\":\"张三\",\"age\":24}";User user = gson.fromJson(jsonString, User.class);

二、属性重命名 @SerializedName 注解的使用

从上面POJO的生成与解析可以看出json的字段和值是的名称和类型是一一对应的,但也有一定容错机制(如第一个例子第3行将字符串的99.99转成double型),但有时候也会出现一些不和谐的情况,如:

期望的json格式:{"name":"张三","age":24,"emailAddress":"zhangsan@ceshi.com"}

实际:{"name":"张三","age":24,"email_address":"zhangsan@ceshi.com"}

Gson在序列化和反序列化时需要使用反射,一般各类库都将注解放到annotations包下,打开源码在com.google.gson包下有一个annotations,里面有一个SerializedName的注解类。对于json中email_address这个属性对应POJO的属性则变成: 

@SerializedName("email_address")public String emailAddress;

为POJO字段提供备选属性名:SerializedName注解提供了两个属性,上面用到了其中一个,别外还有一个属性alternate,接收一个String数组

注:alternate需要2.4版本

@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})public String emailAddress;//当三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果//当多种情况同时出时,以最后一个出现的值为准。Gson gson = new Gson();String json = "{\"name\":\"张三kidou\",\"age\":24,\"emailAddress\":\"zhangsan@ceshi.com\",\"email\":\"zhangsan_2@ceshi.com\",\"email_address\":\"zhangsan_3@ceshi.com\"}";User user = gson.fromJson(json, User.class);System.out.println(user.emailAddress); // zhangsan_3@example.com

三、Gson中使用泛型

例如:JSON字符串数组:["Android","Java","PHP"]

当要通过Gson解析这个json时,一般有两种方式:使用数组,使用List;而List对于增删都是比较方便的,所以实际使用是还是List比较多

数组比较简单:

Gson gson = new Gson();String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";String[] strings = gson.fromJson(jsonArray, String[].class);

对于List将上面的代码中的 String[].class 直接改为 List.class 是不行的,对于Java来说List 和List 这俩个的字节码文件只一个那就是List.class,这是Java泛型使用时要注意的问题 泛型擦除

为了解决的上面的问题,Gson提供了TypeToken来实现对泛型的支持,所以将以上的数据解析为List时需要这样写

Gson gson = new Gson();String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";String[] strings = gson.fromJson(jsonArray, String[].class);List stringList = gson.fromJson(jsonArray, new TypeToken>() {}.getType());//TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken>() {}.getType() 而不是 new TypeToken>().getType()

泛型解析对接口POJO的设计影响

泛型的引入可以减少无关的代码:  

{"code":"0","message":"success","data":{}}{"code":"0","message":"success","data":[]}

我们真正需要的data所包含的数据,而code只使用一次,message则几乎不用,如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义POJO

public class UserResponse { public int code; public String message; public User data;}

当其它接口的时候又重新定义一个XXResponse将data的类型改成XX,很明显code,和message被重复定义了多次,通过泛型可以将code和message字段抽取到一个Result的类中,这样只需要编写data字段所对应的POJO即可:

public class Result { public int code; public String message; public T data;} //对于data字段是User时则可以写为 Result ,当是个列表的时候为 Result>

四、Gson的流式反序列化

(1)自动方式

Gson提供了fromJson()和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法  

Gson.toJson(Object);Gson.fromJson(Reader,Class);Gson.fromJson(String,Class);Gson.fromJson(Reader,Type);Gson.fromJson(String,Type);

(2)手动方式:手动的方式就是使用stream包下的JsonReader类来手动实现反序列化,和Android中使用pull解析XML是比较类似的

String json = "{\"name\":\"张三\",\"age\":\"24\"}";User user = new User();JsonReader reader = new JsonReader(new StringReader(json));reader.beginObject();while (reader.hasNext()) { String s = reader.nextName(); switch (s) { case "name": user.name = reader.nextString(); break; case "age": user.age = reader.nextInt(); //自动转换 break; case "email": user.email = reader.nextString(); break; }}reader.endObject(); // throws IOExceptionSystem.out.println(user.name); //张三System.out.println(user.age); // 24System.out.println(user.email); //zhangsan@ceshi.com

自动方式最终都是通过JsonReader来实现的,如果第一个参数是String类型,那么Gson会创建一个StringReader转换成流操作

五、Gson的流式序列化

(1)自动方式

Gson.toJson方法列表

//PrintStream(System.out) 、StringBuilder、StringBuffer和*Writer都实现了Appendable接口。  Gson gson = new Gson();User user = new User("张三",24,"zhangsan@ceshi.com");gson.toJson(user,System.out);

(2)手动方式

JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));writer.beginObject() // throws IOException .name("name").value("张三") .name("age").value(24) .name("email").nullValue() //演示null .endObject(); // throws IOException writer.flush(); // throws IOException//{"name":"张三","age":24,"email":null}//除了beginObject、endObject还有beginArray和endArray,两者可以相互嵌套,注意配对即可。beginArray后不可以调用name方法,同样beginObject后在调用value之前必须要调用name方法。

六、 使用GsonBuilder导出null值、格式化输出、日期时间

一般情况下Gson类提供的 API已经能满足大部分的使用场景,但有时需要更多特殊、强大的功能时,这时候就引入一个新的类 GsonBuilder。

GsonBuilder从名上也能知道是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson

GsonBuilder用法: 

//各种配置 //生成配置好的GsonGson gson = new GsonBuilder().create();

(1)Gson在默认情况下是不动导出值null的键的,如:

public class User { public String name; public int age;   //省略 public String email;}Gson gson = new Gson();User user = new User(张三",24);System.out.println(gson.toJson(user)); //{"name":"张三","age":24}//email字段是没有在json中出现的,当在调试时需要导出完整的json串时或API接中要求没有值必须用Null时,就会比较有用。

使用方法:

Gson gson = new GsonBuilder().serializeNulls() .create();User user = new User("张三", 24);System.out.println(gson.toJson(user)); //{"name":"张三","age":24,"email":null}

格式化输出、日期时间及其它:

Gson gson = new GsonBuilder() //序列化null .serializeNulls() // 设置日期时间格式,另有2个重载方法 // 在序列化和反序化时均生效 .setDateFormat("yyyy-MM-dd") // 禁此序列化内部类 .disableInnerClassSerialization() //生成不可执行的Json(多了 )]}' 这4个字符) .generateNonExecutableJson() //禁止转义html标签 .disableHtmlEscaping() //格式化输出 .setPrettyPrinting() .create();//:内部类(Inner Class)和嵌套类(Nested Class)的区别

以上是"Java中Gson怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

张三 序列 方法 生成 方式 属性 字段 格式 数据 类型 情况 手动 注解 两个 内容 同时 字符 数组 日期 时间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎样修改数据库锁定的地区 安卓解锁数据库 中国网络安全技术大赛 青岛对日软件开发 网络安全谁管理谁负责谁使用 我的世界离线登录创建服务器 两个数据库数据相加 戴尔服务器t420加内存 数据库的安全主要威胁 合肥斑马网络技术有限公司 小手拉大手网络安全记心间 宁波新玥航标网络技术有限公司 大华存储服务器支持硬盘热插拔吗 与ea服务器连接中断是被封了吗 架构图网络安全 网络安全的帖子 网络安全保障能力实现新跨越 湖北软件开发定制哪家好 网络安全手抄报字少的 中国网络安全战略布局 国家网络安全宣传片成都 软件开发前台与前端的区别 江苏pdu服务器专用电源哪种好 网络安全意识手抄报图片 淄博智慧党建软件开发 什么网络技术会比较吃香 服务器管理器添加墨迹 基因注释数据库 重庆市欣业邦网络技术有限公司 模拟仿真教学软件开发
0