1、简述
> 数组 / 集合序列化 采用数组的形式 gson.fromJson(json, XXX[].class); 采用集合List的形式 gson.fromJson(json, new TypeToken<XXX>() {}.getType());
2.基本类
/** * 基本类 * @author sunRainAmazing */ @Data @NoArgsConstructor @AllArgsConstructor public class GsonEntity { private Integer id; private String name; private Date birthday; }
3、测试类
package sun.rain.amazing.gson.quickstart; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import org.junit.Test; import sun.rain.amazing.gson.anno.coll.UserEntity; import sun.rain.amazing.gson.quickstart.arraylist.GsonEntity; import java.util.*; /** * @author Reese */ public class GsonArrayListTest { GsonEntity user0 = new GsonEntity(101,"tom",new Date()); GsonEntity user1 = new GsonEntity(101,"tom",new Date()); GsonEntity user2 = new GsonEntity(101,"tom",new Date()); private Gson gson = new Gson(); /** *[{"id":101,"name":"tom","birthday":"Jul 5, 2018 3:52:48 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 3:52:48 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 3:52:48 PM"}] * [GsonEntity(id=101, name=tom, birthday=Thu Jul 05 15:52:48 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 15:52:48 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 15:52:48 CST 2018)] * [ * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * } * ] * [GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018)] * * */ @Test public void testArray(){ GsonEntity[] us = {user0,user1,user2}; // new Gson() 序列化 和 反序列化 String jsonArr = gson.toJson(us); System.out.println(jsonArr); // 反序列化 GsonEntity[] usersArr = gson.fromJson(jsonArr, GsonEntity[].class); System.out.println(Arrays.asList(usersArr)); // new GsonBuilder() 序列化 和 反序列化 gson = new GsonBuilder() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd") .create(); jsonArr = gson.toJson(us); System.out.println(jsonArr); // 反序列化 usersArr = gson.fromJson(jsonArr, GsonEntity[].class); System.out.println(Arrays.asList(usersArr)); } /** * 注意:数组的字节码文件可以反射出具体的数组中的对象类型, * 但是List<GsonEntity>不能直接用List<GsonEntity>.class 或List.class。 * 因为泛型编译成字节码时是擦除类型的,List<GsonEntity>和List<SomeOne> * 在编译成字节码后完全一样,没区别。 * * 泛型集合得用 new TypeToken(List<GsonEntity>){}.getType()作为反序列的第二个参数。 * * 但是 可以用数组 来接收 List的类型 * * 见如下测试 * [{"id":101,"name":"tom","birthday":"Jul 5, 2018 4:02:20 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 4:02:20 PM"} * ,{"id":101,"name":"tom","birthday":"Jul 5, 2018 4:02:20 PM"}] * [GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:02:20 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:02:20 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:02:20 CST 2018)] * [ * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * } * ] * [GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018)] * */ @Test public void testListByArray(){ List<GsonEntity> list = new LinkedList<>(); list.add(user0); list.add(user1); list.add(user2); // new Gson() 序列化 和 反序列化 String jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 GsonEntity[] usersArr = gson.fromJson(jsonArr, GsonEntity[].class); System.out.println(Arrays.asList(usersArr)); // new GsonBuilder() 序列化 和 反序列化 gson = new GsonBuilder() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd") .create(); jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 usersArr = gson.fromJson(jsonArr, GsonEntity[].class); System.out.println(Arrays.asList(usersArr)); } /** * 在新版本 gson 2.8.5中 * List 类型 会 默认转为 数组 * 并且数值 在反序列化时 也会 改变 * * [{"id":101,"name":"tom","birthday":"Jul 5, 2018 4:04:57 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 4:04:57 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 4:04:57 PM"}] * * {id=101.0, name=tom, birthday=Jul 5, 2018 4:04:57 PM} * * [[{id=101.0, name=tom, birthday=Jul 5, 2018 4:04:57 PM}, * {id=101.0, name=tom, birthday=Jul 5, 2018 4:04:57 PM}, * {id=101.0, name=tom, birthday=Jul 5, 2018 4:04:57 PM}]] * [ * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * } * ] * [[{id=101.0, name=tom, birthday=2018-07-05}, * {id=101.0, name=tom, birthday=2018-07-05}, * {id=101.0, name=tom, birthday=2018-07-05}]] */ @Test public void testList(){ List<GsonEntity> list = new ArrayList<>(); list.add(user0); list.add(user1); list.add(user2); // new Gson() 序列化 和 反序列化 String jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 List<GsonEntity> usersList = gson.fromJson(jsonArr, List.class); System.out.println(usersList.get(1)); System.out.println(Arrays.asList(usersList)); // new GsonBuilder() 序列化 和 反序列化 gson = new GsonBuilder() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd") .create(); jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 usersList = gson.fromJson(jsonArr, List.class); System.out.println(Arrays.asList(usersList)); } /** * 添加反序列化参数 类型 * 采用 第二参数的形式 -- 进行解析 * [{"id":101,"name":"tom","birthday":"Jul 5, 2018 4:12:31 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 4:12:31 PM"}, * {"id":101,"name":"tom","birthday":"Jul 5, 2018 4:12:31 PM"}] * * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:12:31 CST 2018) * * [[GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:12:31 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:12:31 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 16:12:31 CST 2018)]] * [ * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * }, * { * "id": 101, * "name": "tom", * "birthday": "2018-07-05" * } * ] * [[GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018), * GsonEntity(id=101, name=tom, birthday=Thu Jul 05 00:00:00 CST 2018)]] * */ @Test public void testListArgs(){ List<GsonEntity> list = new ArrayList<>(); list.add(user0); list.add(user1); list.add(user2); // new Gson() 序列化 和 反序列化 String jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 List<GsonEntity> usersList = gson.fromJson(jsonArr, new TypeToken<List<GsonEntity>>(){}.getType()); System.out.println(usersList.get(1)); System.out.println(Arrays.asList(usersList)); // new GsonBuilder() 序列化 和 反序列化 gson = new GsonBuilder() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd") .create(); jsonArr = gson.toJson(list); System.out.println(jsonArr); // 反序列化 usersList = gson.fromJson(jsonArr, new TypeToken<List<GsonEntity>>(){}.getType()); System.out.println(Arrays.asList(usersList)); } }