Gson系列1 --- Gson 序列化与反序列化 -- 数组 / 集合序列化

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));

    }

}

猜你喜欢

转载自blog.csdn.net/sunrainamazing/article/details/80952384