Google Gson 应用泛型

思考如何解析如下两个 JSON 字符串

{
  "id":1,
  "user":
  {
    "account":"admin",
    "password":"123456",
    "name":"John",
    "age":30
  },
  "memo":"xxx"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
{
  "id":2,
  "user":
  [{
    "account":"admin",
    "password":"123456",
    "name":"John",
    "age":30
  },{
    "account":"user1",
    "password":"654321",
    "name":"Leo",
    "age":22
  }],
  "memo":"yyy"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这两个字符串除了“user”属性内容不同外,其他属性都是相同的,通常需要新建两个 POJO 类分别对应这两个 JSON 字符串进行解析

第一个 JSON 字符串对应的 POJO 类

class JsonObject {
    private int id;
    private User user;
    private String memo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }
}
  • 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

第二个 JSON 字符串对应的 POJO 类

class JsonObject {
    private int id;
    private List<User> user;
    private String memo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<User> getUser() {
        return user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }
}
  • 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

如果使用泛型只需要新建如下一个 POJO 类

class JsonObject<T> {
    private int id;
    private T user;
    private String memo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public T getUser() {
        return user;
    }

    public void setUser(T user) {
        this.user = user;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }

    @Override
    public String toString() {
        return "JsonObject [id=" + id + ", user=" + user + ", memo=" + memo + "]";
    }

}
  • 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

测试代码:

@Test
public void test() {
    Gson gson = new Gson();
    String jsonStr1 = "{\"id\":1," 
            + "\"user\":{\"account\":\"admin\",\"password\":\"123456\",\"name\":\"John\",\"age\":30}," 
            + "\"memo\":\"xxx\"}";
    String jsonStr2 = "{\"id\":2," 
            + "\"user\":[{\"account\":\"admin\",\"password\":\"123456\",\"name\":\"John\",\"age\":30}," 
            + "{\"account\":\"user1\",\"password\":\"654321\",\"name\":\"Leo\",\"age\":22}]," 
            + "\"memo\":\"yyy\"}";
    JsonObject<User> object1 = gson.fromJson(jsonStr1, 
        new TypeToken<JsonObject<User>>() {}.getType());
    System.out.println(object1);
    JsonObject<List<User>> object2 = gson.fromJson(jsonStr2, 
        new TypeToken<JsonObject<List<User>>>() {}.getType());
    System.out.println(object2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行测试结果: 
这里写图片描述

当然也可以通过以下方式解析

@Test
public void test() {
    Gson gson = new Gson();
    String jsonStr1 = "{\"id\":1," 
            + "\"user\":{\"account\":\"admin\",\"password\":\"123456\",\"name\":\"John\",\"age\":30}," 
            + "\"memo\":\"xxx\"}";
    String jsonStr2 = "{\"id\":2," 
            + "\"user\":[{\"account\":\"admin\",\"password\":\"123456\",\"name\":\"John\",\"age\":30}," 
            + "{\"account\":\"user1\",\"password\":\"654321\",\"name\":\"Leo\",\"age\":22}]," 
            + "\"memo\":\"yyy\"}";
    JsonObject<User> object1 = gson.fromJson(jsonStr1, JsonObject.class);
    System.out.println(object1);
    JsonObject<List<User>> object2 = gson.fromJson(jsonStr2, JsonObject.class);
    System.out.println(object2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行测试结果: 
这里写图片描述

不过这样解析会有类型未检查的警告

Type safety: The expression of type JsonObject needs unchecked conversion to conform to JsonObject<User>

猜你喜欢

转载自blog.csdn.net/suyimin2010/article/details/81230314