Gson Overview : Generics
Ở phần trước, chúng ta đã tìm hiểu về mapping enum của Gson, ở phần này ta sẽ tìm hiểu cách serialize của các Object có Generics. Nếu bạn thắc mắc generics là gì thì hãy xem bài viết này để hiểu rõ hơn trước khi đọc tiếp bài viết này Serialization of Generics Hãy bắt đầu bằng một ví dụ đơn ...
Ở phần trước, chúng ta đã tìm hiểu về mapping enum của Gson, ở phần này ta sẽ tìm hiểu cách serialize của các Object có Generics.
Nếu bạn thắc mắc generics là gì thì hãy xem bài viết này để hiểu rõ hơn trước khi đọc tiếp bài viết này
Serialization of Generics
Hãy bắt đầu bằng một ví dụ đơn giản : Chúng ta muốn convert một java object sang Json thì chỉ cần biết các kiểu data của object đó và cách mapping thế nào với Json là được phải không ?
Thực tế có một trường hợp rất hay gặp khi sử dụng Generics đó là object có chứa kiểu : Java Collections. Giả sử ta có một object gồm 2 List, trong đó có 1 list chứa các items kiểu Integer, và 1 list kiểu String.
Bình thường,ta sử dụng Gson khi convert object này sang Json chỉ đơn giản gọi hàm gson.toJson()
Gson gson = new Gson(); List<Integer> integerList = new ArrayList<>(); integerList.add(1); integerList.add(2); integerList.add(3); List<String> stringList = new ArrayList<>(); stringList.add("1"); stringList.add("2"); stringList.add("3"); String integerJson = gson.toJson(integerList); String stringJson = gson.toJson(stringList);
Thông thường việc convert diễn ra bình thường không có vấn đề gì, tuy nhiên Gson lại không đảm bảo việc JsonObject được convert ra đúng như bạn muốn. VỚi các kiểu data nguyên thủy thông thường, việc convert không xảy ra vấn đề gì và ta hoàn toàn có thể check lại được. nhưng với các object có data phức tạp, thì Gson khuyên bạn sử dụng new TypeToken
Gson gson = new Gson(); List<Integer> integerList = new ArrayList<>(); integerList.add(1); integerList.add(2); integerList.add(3); List<String> stringList = new ArrayList<>(); stringList.add("1"); stringList.add("2"); stringList.add("3"); Type integerType = new TypeToken<List<Integer>>() {}.getType(); Type stringType = new TypeToken<List<String>>() {}.getType(); String integerJson = gson.toJson(integerList, integerType); String stringJson = gson.toJson(stringList, stringType);
new TypeToken sẽ tạo ra một inner class rỗng và anonymous, vì vậy khi khai báo ta sẽ thấy nó có kiểu () {} hơi kì cục. Tuy nhiên, điều này đảm bảo Gson sẽ biết được chính xác kiểu generics mà bạn mong muốn khi convert sang JsonObject.
integerJson = "[1,2,3]" stringJson = "["1","2","3"]"
Đến với một ví dụ đơn giản nữa, cũng như ví dụ trên, có vẻ không cần thiết thì thông thường hàm toJson() hoạt động tốt thế nhưng đến Gson còn khuyên chúng ta nên làm quen việc sử dụng TypeToken thì không có lý gì ta lại bỏ qua nó nếu không muốn vướng phải vào những lỗi không thể lường trước được