一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 使用GSON庫轉(zhuǎn)換Java對(duì)象為JSON對(duì)象的進(jìn)階實(shí)例詳解

使用GSON庫轉(zhuǎn)換Java對(duì)象為JSON對(duì)象的進(jìn)階實(shí)例詳解

2020-05-20 11:37李坤 JAVA教程

這篇文章主要介紹了使用GSON庫轉(zhuǎn)換Java對(duì)象為JSON對(duì)象的進(jìn)階實(shí)例詳解,包括注冊(cè)TypeAdapter及處理Enum類型等實(shí)際運(yùn)用中可能遇到的一些復(fù)雜問題,需要的朋友可以參考下

對(duì)List和map等結(jié)構(gòu)的常用轉(zhuǎn)換操作基本上可以滿足我們處理的絕大多數(shù)需求,但有時(shí)項(xiàng)目中對(duì)json有特殊的格式規(guī)定.比如下面的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":"講師"}]}]

分析之后我們發(fā)現(xiàn)普通的方式都不好處理上面的json串.請(qǐng)看本文是如何處理的吧:

實(shí)體類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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 + ", id="codetool">

注意這里定義了一個(gè)TableData實(shí)體類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
  }
}

測(cè)試類:
(仔細(xì)看將json轉(zhuǎn)回為對(duì)象的實(shí)現(xiàn),這里經(jīng)過兩次轉(zhuǎn)化,第一次轉(zhuǎn)回的結(jié)果是map不是我們所期望的對(duì)象,對(duì)map再次轉(zhuǎn)為json后再轉(zhuǎn)為對(duì)象,我引用的是Gson2.1的jar處理正常,好像使用Gson1.6的jar會(huì)報(bào)錯(cuò),所以建議用最新版本)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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) {
    // 對(duì)象轉(zhuǎn)為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);
    // 結(jié)果:[{"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":"講師"}]}]
    // 對(duì)象轉(zhuǎn)為Json-->end
 
    // /////////////////////////////////////////////////////////////////////
 
    // 將json轉(zhuǎn)為數(shù)據(jù)-->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轉(zhuǎn)為對(duì)象-->end
  }
}

輸出結(jié)果:

?

      1
      2
      3
      4
      5
      6
      7
      8
      [{"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=米老師, id="codetool">

      注冊(cè)TypeAdapter及處理Enum類型

      枚舉類型給我們的程序帶來了好處,如何用Gson來實(shí)現(xiàn)與Json的互轉(zhuǎn)呢?請(qǐng)看本文.

      本文重點(diǎn)掌握如何自己寫一個(gè)TypeAdapter及注冊(cè)TypeAdapter和處理Enum類型.

      實(shí)體類:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      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 + "]";
        }
      }

      自己寫一個(gè)轉(zhuǎn)換器實(shí)現(xiàn)JsonSerializer<T>接口和jsonDeserializer<T>接口:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      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> {
       
        // 對(duì)象轉(zhuǎn)為Json時(shí)調(diào)用,實(shí)現(xiàn)JsonSerializer<PackageState>接口
        @Override
        public JsonElement serialize(PackageState state, Type arg1,
            JsonSerializationContext arg2) {
          return new JsonPrimitive(state.ordinal());
        }
       
        // json轉(zhuǎn)為對(duì)象時(shí)調(diào)用,實(shí)現(xiàn)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;
        }
       
      }

      測(cè)試類:

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      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);// 這個(gè) state是枚舉值
       
          String s = gson.toJson(item);
          System.out.println(s);
       
          System.out.println("--------------------------------");
       
          PackageItem retItem = gson.fromJson(s, PackageItem.class);
          System.out.println(retItem);
        }
      }


      輸出結(jié)果(結(jié)果中已經(jīng)將state的對(duì)應(yīng)枚舉類型轉(zhuǎn)為了int類型):

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

      延伸 · 閱讀

      精彩推薦
      主站蜘蛛池模板: 91精品国产91久久久久 | 2019韩国最新三级 | 精品国产一区二区三区久久久狼 | 国产高清视频在线 | 青青草亚洲 | 无码精品一区二区三区免费视频 | 高人先生免费观看全集 | 日韩欧美a | 久久影院中文字幕 | 狠狠色综合久久婷婷色天使 | 2018天天拍拍拍免费视频 | 538精品视频 | 精品久久久久久国产 | 国产99久久精品 | 国产1区2区在线观看 | 亚洲人成网站在线观看播放青青 | 奇米小说| 无限在线观看视频大全免费高清 | 亚洲欧美日韩综合一区久久 | 欧美亚洲天堂网 | 无码人妻少妇色欲AV一区二区 | 欧美日韩国产超高清免费看片 | 国产精品免费小视频 | ova催眠性指导5最新在线 | 97超pen个人视频公开视频视 | 青青精品 | 美女脱了内裤打开腿让人羞羞软件 | 国产裸露片段精华合集链接 | 韩国黄色网址 | 黄a一级| oneday日本在线观看完整版 | 91素人约啪 | 性刺激欧美三级在线现看中文 | 精品日本三级在线观看视频 | 日麻逼 | 欧美日韩视频在线一区二区 | 日韩欧美一区二区三区免费看 | 男人天堂网www | 日韩精品视频福利资源站 | 天堂资源8中文最新版 | jiuse视频 |