关于gson:Gson的TypeToken与泛型擦除

原创:扣钉日记(微信公众号ID:codelogs),欢送分享,转载请保留出处。问题在Java的json框架中,Gson是应用得比拟宽泛的一个,其Gson类提供了toJson()与fromJson()办法,别离用来序列化与反序列化。 json序列化用得最多的场景是在调用内部服务接口时,大抵如下: @Data@AllArgsConstructorpublic class Response<T>{ int code; String message; T body;}@Data@AllArgsConstructorpublic class PersonInfo{ long id; String name; int age;}/** * 服务端 */public class Server { public static String getPersonById(Long id){ PersonInfo personInfo = new PersonInfo(1234L, "zhangesan", 18); Response<PersonInfo> response = new Response<>(200, "success", personInfo); //序列化 return new Gson().toJson(response); }}/** * 客户端 */public class Client { public static void getPerson(){ String responseStr = Server.getPersonById(1234L); //反序列化 Response<PersonInfo> response = new Gson().fromJson(responseStr, new TypeToken<Response<PersonInfo>>(){}.getType()); System.out.println(response); }}因为大多数接口设计中,都会有对立的响应码构造,因而大多我的项目都会像下面一样,设计一个通用Response类来对应这种对立响应码构造,是很常见的状况。 ...

September 5, 2022 · 2 min · jiezi

关于gson:java基础序列化反序列化gson基础知识

以下内容来之官网翻译,地址 1.Gson依赖1.1.Gradle/Androiddependencies { implementation 'com.google.code.gson:gson:2.9.0'}1.2.maven<dependencies> <!-- Gson: Java to Json conversion --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.9.0</version> <scope>compile</scope> </dependency></dependencies>1.2.Gson简略实用1.2.1.根底类型// SerializationGson gson = new Gson();gson.toJson(1); // ==> 1gson.toJson("abcd"); // ==> "abcd"gson.toJson(new Long(10)); // ==> 10int[] values = { 1 };gson.toJson(values); // ==> [1]// Deserializationint one = gson.fromJson("1", int.class);Integer one = gson.fromJson("1", Integer.class);Long one = gson.fromJson("1", Long.class);Boolean false = gson.fromJson("false", Boolean.class);String str = gson.fromJson("\"abc\"", String.class);String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class);1.2.2.对象class BagOfPrimitives { private int value1 = 1; private String value2 = "abc"; private transient int value3 = 3; BagOfPrimitives() { // no-args constructor }}// SerializationBagOfPrimitives obj = new BagOfPrimitives();Gson gson = new Gson();String json = gson.toJson(obj); // ==> json is {"value1":1,"value2":"abc"}// DeserializationBagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);// ==> obj2 is just like objNotes 如果对象内存在循环援用,序列化时将导致死循环。 ...

April 9, 2022 · 4 min · jiezi

Gson实战之旅

前言最近因为FastJson最近几年的安全漏洞频发,所以后续的项目准备切换到Gson中,而前面的项目也开始准备逐步切换到Gson。 而本文就是因此而产生,本文将会围绕一系列实际的需求来展示如何使用Gson解决实际开发上遇到的问题。 Gson之旅如同前言所说的,以下的章节都是本人遇到的实际场景后如何使用Gson的记录。 初识GsonGson是一个Google开源出来针在Java对象和JSON数据之间进行相互映射的Java类库。而且使用方式很简单。以maven项目为例,只需要添加以下配置即可使用。 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope></dependency>Java对象转JSON而且Gson的API使用起来也很简单,例如Java对象转成JSON字符串,只需要调用Gson的toJson方法即可,示例如下 Gson gson = new Gson();Student student = new Student();student.setId(1L);student.setName("测试用户");student.setSex(false);System.out.println(gson.toJson(student));输出结果 {"id":1,"name":"测试用户","sex":false}JSON转Java对象而将JSON字符串转成Java对象也很简单,只需要调用Gson的fromJson方法即可,示例如下 Gson gson = new Gson();String jsonStr ="{'id':1,'name':'测试用户','sex':false}";Student student = gson.fromJson(jsonStr,Student.class);输出结果 Student(id=1, name=测试用户, sex=false, birthday=null)这里需要注意以下两点 fromJson方法需要传入的是==JSON格式的字符串==和对应==Java对象的类型==才行。Gson是可以识别使用==单引号==的JSON字符串,而实际上==JSON格式规范里面是需要使用双引号==。演示的Student类源码@Data是lombok框架的注解,可以自动生成对应的getter/setter和toString方法。 @Datapublic class Student implements Serializable { /** * 学生ID */ private Long id; /** * 学生名称 */ private String name; /** * 学生性别 */ private Boolean sex; /** * 出生年月日 */ private Date birthday;}日期格式化于是就开始了Gson的使用,很快我就遇到第一个问题了。使用Gson处理第三方接口传过来的JSON字符串时,可以正确将yyyy-MM-dd HH:mm:ss格式(例如2020-01-30 11:30:00)的值转为对应的Date对象。 ...

June 7, 2020 · 1 min · jiezi