首页 > 编程 > Java > 正文

使用GSON库转换Java对象为JSON对象的进阶实例详解

2019-11-26 14:09:27
字体:
来源:转载
供稿:网友

对List和map等结构的常用转换操作基本上可以满足我们处理的绝大多数需求,但有时项目中对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         + "]";   }  } 

注意这里定义了一个TableData实体类:

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=讲师] 

注册TypeAdapter及处理Enum类型

枚举类型给我们的程序带来了好处,如何用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>接口:

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


输出结果(结果中已经将state的对应枚举类型转为了int类型):

{"name":"item_name","state":2,"size":"500M"} -------------------------------- PackageItem [name=item_name, size=500M, state=UPDATING] 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表