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 sunRainAmazing
*/
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));
}
}