背景
在日常使用http请求时经常会有对返回数据的解析。返回数据一般包含int code的状态码+String message的状态消息+T data的数据内容。在做JSON串解析时需要支持对泛型的解析。
实现
添加依赖
implementation'com.google.code.gson:gson:2.8.5'
示例代码
private class Base<T> {
private int code;
private String message;
private T data;
public Base(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
@Override
public String toString() {
return "base{" +
"code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}
private class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
@Test
public void testGson() {
Gson gson = new Gson();
Person person = new Person(20, "Wang");
System.out.println("----- person -----");
System.out.println(person);
String personJson = gson.toJson(person);
System.out.println("----- person json -----");
System.out.println(personJson);
Person personResult = gson.fromJson(personJson, Person.class);
System.out.println("----- person fromJson result -----");
System.out.println(personResult);
Base<Person> base = new Base<>(100, "Person", person);
System.out.println("----- base -----");
System.out.println(base);
String baseJson = gson.toJson(base);
System.out.println("----- base json -----");
System.out.println(baseJson);
Base<Person> baseResult = gson.fromJson(baseJson, new TypeToken<Base<Person>>() {
}.getType());
System.out.println("----- base fromJson result -----");
System.out.println(baseResult);
}
输出结果
----- person -----
Person{age=20, name='Wang'}
----- person json -----
{"age":20,"name":"Wang"}
----- person fromJson result -----
Person{age=20, name='Wang'}
----- base -----
base{code=100, message='Person', data=Person{age=20, name='Wang'}}
----- base json -----
{"code":100,"message":"Person","data":{"age":20,"name":"Wang"}}
----- base fromJson result -----
base{code=100, message='Person', data=Person{age=20, name='Wang'}}
总结
通过使用Gson库中的TypeToken可以解析带泛型的对象。