Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list
实体类:
- public class Student {
- private int id;
- private String name;
- private Date birthDay;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthDay() {
- return birthDay;
- }
- public void setBirthDay(Date birthDay) {
- this.birthDay = birthDay;
- }
- @Override
- public String toString() {
- return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
- + name + "]";
- }
- }
测试类:
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import com.google.gson.Gson;
- import com.google.gson.reflect.TypeToken;
- public class GsonTest1 {
- public static void main(String[] args) {
- Gson gson = new Gson();
- Student student1 = new Student();
- student1.setId(1);
- student1.setName("李坤");
- student1.setBirthDay(new Date());
- // //
- System.out.println("----------简单对象之间的转化-------------");
- // 简单的bean转为json
- String s1 = gson.toJson(student1);
- System.out.println("简单Bean转化为Json===" + s1);
- // json转为简单Bean
- Student student = gson.fromJson(s1, Student.class);
- System.out.println("Json转为简单Bean===" + student);
- // 结果:
- // 简单Bean转化为Json==={"id":1,"name":"李坤","birthDay":"Jun 22, 2012 8:27:52 AM"}
- // Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,
- // name=李坤]
- // //
- Student student2 = new Student();
- student2.setId(2);
- student2.setName("曹贵生");
- student2.setBirthDay(new Date());
- Student student3 = new Student();
- student3.setId(3);
- student3.setName("柳波");
- student3.setBirthDay(new Date());
- List<Student> list = new ArrayList<Student>();
- list.add(student1);
- list.add(student2);
- list.add(student3);
- System.out.println("----------带泛型的List之间的转化-------------");
- // 带泛型的list转化为json
- String s2 = gson.toJson(list);
- System.out.println("带泛型的list转化为json==" + s2);
- // json转为带泛型的list
- List<Student> retList = gson.fromJson(s2,
- new TypeToken<List<Student>>() {
- }.getType());
- for (Student stu : retList) {
- System.out.println(stu);
- }
- // 结果:
- // 带泛型的list转化为json==[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 8:28:52 AM"}]
- // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=李坤]
- // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=曹贵生]
- // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=柳波]
- }
- }
执行结果:
- ----------简单对象之间的转化-------------
- 简单Bean转化为Json==={"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:10:31 PM"}
- Json转为简单Bean===Student [birthDay=Fri Jun 22 21:10:31 CST 2012, id=1, name=李坤]
- ----------带泛型的List之间的转化-------------
- 带泛型的list转化为json==[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:10:31 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 9:10:31 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:10:31 PM"}]
- Student [birthDay=Fri Jun 22 21:10:31 CST 2012, id=1, name=李坤]
- Student [birthDay=Fri Jun 22 21:10:31 CST 2012, id=2, name=曹贵生]
- Student [birthDay=Fri Jun 22 21:10:31 CST 2012, id=3, name=柳波]
Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (http://blog.csdn.net/lk_blog/article/details/7685169)
Json转换利器Gson之实例二-Gson注解和GsonBuilder (http://blog.csdn.net/lk_blog/article/details/7685190)
Json转换利器Gson之实例三-Map处理(上) (http://blog.csdn.net/lk_blog/article/details/7685210)
Json转换利器Gson之实例四-Map处理(下) (http://blog.csdn.net/lk_blog/article/details/7685224)
Json转换利器Gson之实例五-实际开发中的特殊需求处理 (http://blog.csdn.net/lk_blog/article/details/7685237)
Json转换利器Gson之实例六-注册TypeAdapter及处理Enum类型 (http://blog.csdn.net/lk_blog/article/details/7685347)
实例代码下载: http://download.csdn.net/detail/lk_blog/4387822
有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json.
有时候我们的实体类会随着版本的升级而修改.
有时候我们想对输出的json默认排好格式.
... ...
请看下面的例子吧:
实体类:
- import java.util.Date;
- import com.google.gson.annotations.Expose;
- import com.google.gson.annotations.SerializedName;
- public class Student {
- private int id;
- @Expose
- private String name;
- @Expose
- @SerializedName("bir")
- private Date birthDay;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthDay() {
- return birthDay;
- }
- public void setBirthDay(Date birthDay) {
- this.birthDay = birthDay;
- }
- @Override
- public String toString() {
- return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
- + name + "]";
- }
- }
测试类:
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import com.google.gson.FieldNamingPolicy;
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import com.google.gson.reflect.TypeToken;
- public class GsonTest2 {
- public static void main(String[] args) {
- //注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson();
- Gson gson = new GsonBuilder()
- .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
- .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
- .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
- .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
- .setPrettyPrinting() //对json结果格式化.
- .setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
- //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
- //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
- .create();
- Student student1 = new Student();
- student1.setId(1);
- student1.setName("李坤");
- student1.setBirthDay(new Date());
- // //
- System.out.println("----------简单对象之间的转化-------------");
- // 简单的bean转为json
- String s1 = gson.toJson(student1);
- System.out.println("简单Bean转化为Json===" + s1);
- // json转为简单Bean
- Student student = gson.fromJson(s1, Student.class);
- System.out.println("Json转为简单Bean===" + student);
- // //
- Student student2 = new Student();
- student2.setId(2);
- student2.setName("曹贵生");
- student2.setBirthDay(new Date());
- Student student3 = new Student();
- student3.setId(3);
- student3.setName("柳波");
- student3.setBirthDay(new Date());
- List<Student> list = new ArrayList<Student>();
- list.add(student1);
- list.add(student2);
- list.add(student3);
- System.out.println("----------带泛型的List之间的转化-------------");
- // 带泛型的list转化为json
- String s2 = gson.toJson(list);
- System.out.println("带泛型的list转化为json==" + s2);
- // json转为带泛型的list
- List<Student> retList = gson.fromJson(s2,
- new TypeToken<List<Student>>() {
- }.getType());
- for (Student stu : retList) {
- System.out.println(stu);
- }
- }
- }
输出结果:
- ----------简单对象之间的转化-------------
- 简单Bean转化为Json==={
- "Name": "李坤",
- "bir": "2012-06-22 21:26:40:592"
- }
- Json转为简单Bean===Student [birthDay=Fri Jun 22 21:26:40 CST 2012, id=0, name=李坤]
- ----------带泛型的List之间的转化-------------
- 带泛型的list转化为json==[
- {
- "Name": "李坤",
- "bir": "2012-06-22 21:26:40:592"
- },
- {
- "Name": "曹贵生",
- "bir": "2012-06-22 21:26:40:625"
- },
- {
- "Name": "柳波",
- "bir": "2012-06-22 21:26:40:625"
- }
- ]
- Student [birthDay=Fri Jun 22 21:26:40 CST 2012, id=0, name=李坤]
- Student [birthDay=Fri Jun 22 21:26:40 CST 2012, id=0, name=曹贵生]
- Student [birthDay=Fri Jun 22 21:26:40 CST 2012, id=0, name=柳波
Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(本文),还可以是带有泛型的List(下一篇博客).本例中您要重点看如何将Json转回为普通JavaBean对象时TypeToken的定义.
实体类:
- public class Point {
- private int x;
- private int y;
- public Point(int x, int y) {
- this.x = x;
- this.y = y;
- }
- public int getX() {
- return x;
- }
- public void setX(int x) {
- this.x = x;
- }
- public int getY() {
- return y;
- }
- public void setY(int y) {
- this.y = y;
- }
- @Override
- public String toString() {
- return "Point [x=" + x + ", y=" + y + "]";
- }
- }
测试类:
- import java.util.LinkedHashMap;
- import java.util.Map;
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import com.google.gson.reflect.TypeToken;
- public class GsonTest3 {
- public static void main(String[] args) {
- Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
- .create();
- Map<Point, String> map1 = new LinkedHashMap<Point, String>();// 使用LinkedHashMap将结果按先进先出顺序排列
- map1.put(new Point(5, 6), "a");
- map1.put(new Point(8, 8), "b");
- String s = gson.toJson(map1);
- System.out.println(s);// 结果:[[{"x":5,"y":6},"a"],[{"x":8,"y":8},"b"]]
- Map<Point, String> retMap = gson.fromJson(s,
- new TypeToken<Map<Point, String>>() {
- }.getType());
- for (Point p : retMap.keySet()) {
- System.out.println("key:" + p + " values:" + retMap.get(p));
- }
- System.out.println(retMap);
- System.out.println("----------------------------------");
- Map<String, Point> map2 = new LinkedHashMap<String, Point>();
- map2.put("a", new Point(3, 4));
- map2.put("b", new Point(5, 6));
- String s2 = gson.toJson(map2);
- System.out.println(s2);
- Map<String, Point> retMap2 = gson.fromJson(s2,
- new TypeToken<Map<String, Point>>() {
- }.getType());
- for (String key : retMap2.keySet()) {
- System.out.println("key:" + key + " values:" + retMap2.get(key));
- }
- }
- }
结果:
- [[{"x":5,"y":6},"a"],[{"x":8,"y":8},"b"]]
- key:Point [x=5, y=6] values:a
- key:Point [x=8, y=8] values:b
- {Point [x=5, y=6]=a, Point [x=8, y=8]=b}
- ----------------------------------
- {"a":{"x":3,"y":4},"b":{"x":5,"y":6}}
- key:a values:Point [x=3, y=4]
Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(上一篇博客),还可以是带有泛型的List(本文).本例中您要重点看如何将Json转回为带泛型的对象List,并且List中的泛型对象有多种实体.
实体类:
- import java.util.Date;
- public class Student {
- private int id;
- private String name;
- private Date birthDay;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthDay() {
- return birthDay;
- }
- public void setBirthDay(Date birthDay) {
- this.birthDay = birthDay;
- }
- @Override
- public String toString() {
- return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
- + name + "]";
- }
- }
- public class Teacher {
- private int id;
- private String name;
- private String title;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- @Override
- public String toString() {
- return "Teacher [id=" + id + ", name=" + name + ", title=" + title
- + "]";
- }
- }
测试类:
- package com.tgb.lk.demo.gson.test4;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.LinkedHashMap;
- import java.util.List;
- import java.util.Map;
- import com.google.gson.Gson;
- import com.google.gson.reflect.TypeToken;
- public class GsonTest4 {
- public static void main(String[] args) {
- Student student1 = new Student();
- student1.setId(1);
- student1.setName("李坤");
- student1.setBirthDay(new Date());
- Student student2 = new Student();
- student2.setId(2);
- student2.setName("曹贵生");
- student2.setBirthDay(new Date());
- Student student3 = new Student();
- student3.setId(3);
- student3.setName("柳波");
- student3.setBirthDay(new Date());
- List<Student> stulist = new ArrayList<Student>();
- stulist.add(student1);
- stulist.add(student2);
- stulist.add(student3);
- Teacher teacher1 = new Teacher();
- teacher1.setId(1);
- teacher1.setName("米老师");
- teacher1.setTitle("教授");
- Teacher teacher2 = new Teacher();
- teacher2.setId(2);
- teacher2.setName("丁老师");
- teacher2.setTitle("讲师");
- List<Teacher> teacherList = new ArrayList<Teacher>();
- teacherList.add(teacher1);
- teacherList.add(teacher2);
- Map<String, Object> map = new LinkedHashMap<String, Object>();
- map.put("students", stulist);
- map.put("teachers", teacherList);
- Gson gson = new Gson();
- String s = gson.toJson(map);
- System.out.println(s);
- System.out.println("----------------------------------");
- Map<String, Object> retMap = gson.fromJson(s,
- new TypeToken<Map<String, List<Object>>>() {
- }.getType());
- for (String key : retMap.keySet()) {
- System.out.println("key:" + key + " values:" + retMap.get(key));
- if (key.equals("students")) {
- List<Student> stuList = (List<Student>) retMap.get(key);
- System.out.println(stuList);
- } else if (key.equals("teachers")) {
- List<Teacher> tchrList = (List<Teacher>) retMap.get(key);
- System.out.println(tchrList);
- }
- }
- }
- }
输出结果:
- {"students":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:48:19 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 9:48:19 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:48:19 PM"}],"teachers":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}
- ----------------------------------
- key:students values:[{id=1.0, name=李坤, birthDay=Jun 22, 2012 9:48:19 PM}, {id=2.0, name=曹贵生, birthDay=Jun 22, 2012 9:48:19 PM}, {id=3.0, name=柳波, birthDay=Jun 22, 2012 9:48:19 PM}]
- [{id=1.0, name=李坤, birthDay=Jun 22, 2012 9:48:19 PM}, {id=2.0, name=曹贵生, birthDay=Jun 22, 2012 9:48:19 PM}, {id=3.0, name=柳波, birthDay=Jun 22, 2012 9:48:19 PM}]
- key:teachers values:[{id=1.0, name=米老师, title=教授}, {id=2.0, name=丁老师, title=讲师}]
- [{id=1.0, name=米老师, title=教授}, {id=2.0, name=丁老师, title=讲师}]
前面四篇博客基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析:
[{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:54:49 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}]
分析之后我们发现使用前面博客中用到的都不好处理上面的json串.请看本文是如何处理的吧:
实体类:
- import java.util.Date;
- public class Student {
- private int id;
- private String name;
- private Date birthDay;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthDay() {
- return birthDay;
- }
- public void setBirthDay(Date birthDay) {
- this.birthDay = birthDay;
- }
- @Override
- public String toString() {
- return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
- + name + "]";
- }
- }
- public class Teacher {
- private int id;
- private String name;
- private String title;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- @Override
- public String toString() {
- return "Teacher [id=" + id + ", name=" + name + ", title=" + title
- + "]";
- }
- }
- import java.util.List;
- public class TableData {
- private String tableName;
- private List tableData;
- public String getTableName() {
- return tableName;
- }
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
- public List getTableData() {
- return tableData;
- }
- public void setTableData(List tableData) {
- this.tableData = tableData;
- }
- }
测试类:
(仔细看将json转回为对象的实现,这里经过两次转化,第一次转回的结果是map不是我们所期望的对象,对map再次转为json后再转为对象,我引用的是Gson2.1的jar处理正常,好像使用Gson1.6的jar会报错,所以建议用最新版本)
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import com.google.gson.Gson;
- import com.google.gson.reflect.TypeToken;
- public class GsonTest5 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 对象转为Json-->start
- Student student1 = new Student();
- student1.setId(1);
- student1.setName("李坤");
- student1.setBirthDay(new Date());
- Student student2 = new Student();
- student2.setId(2);
- student2.setName("曹贵生");
- student2.setBirthDay(new Date());
- Student student3 = new Student();
- student3.setId(3);
- student3.setName("柳波");
- student3.setBirthDay(new Date());
- List<Student> stulist = new ArrayList<Student>();
- stulist.add(student1);
- stulist.add(student2);
- stulist.add(student3);
- Teacher teacher1 = new Teacher();
- teacher1.setId(1);
- teacher1.setName("米老师");
- teacher1.setTitle("教授");
- Teacher teacher2 = new Teacher();
- teacher2.setId(2);
- teacher2.setName("丁老师");
- teacher2.setTitle("讲师");
- List<Teacher> teacherList = new ArrayList<Teacher>();
- teacherList.add(teacher1);
- teacherList.add(teacher2);
- TableData td1 = new TableData();
- td1.setTableName("students");
- td1.setTableData(stulist);
- TableData td2 = new TableData();
- td2.setTableName("teachers");
- td2.setTableData(teacherList);
- List<TableData> tdList = new ArrayList<TableData>();
- tdList.add(td1);
- tdList.add(td2);
- Gson gson = new Gson();
- String s = gson.toJson(tdList);
- System.out.println(s);
- // 结果:[{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 10:44:16 AM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 10:44:16 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 10:44:16 AM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}]
- // 对象转为Json-->end
- // /
- // 将json转为数据-->start
- List<TableData> tableDatas2 = gson.fromJson(s,
- new TypeToken<List<TableData>>() {
- }.getType());
- for (int i = 0; i < tableDatas2.size(); i++) {
- TableData entityData = tableDatas2.get(i);
- String tableName = entityData.getTableName();
- List tableData = entityData.getTableData();
- String s2 = gson.toJson(tableData);
- // System.out.println(s2);
- // System.out.println(entityData.getData());
- if (tableName.equals("students")) {
- System.out.println("students");
- List<Student> retStuList = gson.fromJson(s2,
- new TypeToken<List<Student>>() {
- }.getType());
- for (int j = 0; j < retStuList.size(); j++) {
- System.out.println(retStuList.get(j));
- }
- } else if (tableName.equals("teachers")) {
- System.out.println("teachers");
- List<Teacher> retTchrList = gson.fromJson(s2,
- new TypeToken<List<Teacher>>() {
- }.getType());
- for (int j = 0; j < retTchrList.size(); j++) {
- System.out.println(retTchrList.get(j));
- }
- }
- }
- // Json转为对象-->end
- }
- }
输出结果:
- [{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 10:04:12 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 10:04:12 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 10:04:12 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}]
- students
- Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=1, name=李坤]
- Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=2, name=曹贵生]
- Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=3, name=柳波]
- teachers
- Teacher [id=1, name=米老师, title=教授]
- Teacher [id=2, name=丁老师, title=讲师]
枚举类型给我们的程序带来了好处,如何用Gson来实现与Json的互转呢?请看本文.
本文重点掌握如何自己写一个TypeAdapter及注册TypeAdapter和处理Enum类型.
实体类:
- public enum PackageState {
- PLAY, UPDATE, UPDATING, DOWNLOAD, DOWNLOADING,
- }
- public class PackageItem {
- private String name;
- private PackageState state;
- private String size;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public PackageState getState() {
- return state;
- }
- public void setState(PackageState state) {
- this.state = state;
- }
- public String getSize() {
- return size;
- }
- public void setSize(String size) {
- this.size = size;
- }
- @Override
- public String toString() {
- return "PackageItem [name=" + name + ", size=" + size + ", state="
- + state + "]";
- }
- }
自己写一个转换器实现JsonSerializer<T>接口和jsonDeserializer<T>接口:
- mport java.lang.reflect.Type;
- import com.google.gson.JsonDeserializationContext;
- import com.google.gson.JsonDeserializer;
- import com.google.gson.JsonElement;
- import com.google.gson.JsonParseException;
- import com.google.gson.JsonPrimitive;
- import com.google.gson.JsonSerializationContext;
- import com.google.gson.JsonSerializer;
- public class EnumSerializer implements JsonSerializer<PackageState>,
- JsonDeserializer<PackageState> {
- // 对象转为Json时调用,实现JsonSerializer<PackageState>接口
- @Override
- public JsonElement serialize(PackageState state, Type arg1,
- JsonSerializationContext arg2) {
- return new JsonPrimitive(state.ordinal());
- }
- // json转为对象时调用,实现JsonDeserializer<PackageState>接口
- @Override
- public PackageState deserialize(JsonElement json, Type typeOfT,
- JsonDeserializationContext context) throws JsonParseException {
- if (json.getAsInt() < PackageState.values().length)
- return PackageState.values()[json.getAsInt()];
- return null;
- }
- }
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- public class GsonTest6 {
- public static void main(String[] args) {
- GsonBuilder gsonBuilder = new GsonBuilder();
- gsonBuilder.registerTypeAdapter(PackageState.class,
- new EnumSerializer());
- Gson gson = gsonBuilder.create();
- PackageItem item = new PackageItem();
- item.setName("item_name");
- item.setSize("500M");
- item.setState(PackageState.UPDATING);// 这个 state是枚举值
- String s = gson.toJson(item);
- System.out.println(s);
- System.out.println("--------------------------------");
- PackageItem retItem = gson.fromJson(s, PackageItem.class);
- System.out.println(retItem);
- }
- }
- {"name":"item_name","state":2,"size":"500M"}
- --------------------------------
- PackageItem [name=item_name, size=500M, state=UPDATING]
Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (http://blog.csdn.net/lk_blog/article/details/7685169)
Json转换利器Gson之实例二-Gson注解和GsonBuilder (http://blog.csdn.net/lk_blog/article/details/7685190)
Json转换利器Gson之实例三-Map处理(上) (http://blog.csdn.net/lk_blog/article/details/7685210)
Json转换利器Gson之实例四-Map处理(下) (http://blog.csdn.net/lk_blog/article/details/7685224)
Json转换利器Gson之实例五-实际开发中的特殊需求处理 (http://blog.csdn.net/lk_blog/article/details/7685237)
Json转换利器Gson之实例六-注册TypeAdapter及处理Enum类型 (http://blog.csdn.net/lk_blog/article/details/7685347)
实例代码下载: http://download.csdn.net/detail/lk_blog/4387822