Gson
- JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式 - Gson
Google推出的用于在Java对象和JSON数据之间进行映射的Java类库,可以将一个JSON字符串转化为Java对象(反序列化),或者将Java对象转换为JSON字符串(序列化)
Gson使用
implementation 'com.google.code.gson:gson:2.8.5'
Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Student user= gson.fromJson(jsonStr, User.class);
String jsonStr2 = gson.toJson(list);
List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());
TypeToken
@Test
public void test5() {
Gson gson = new Gson();
User user1 = new User(10, "bob");
User user2 = new User(12, "jack");
ArrayList<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
String json = gson.toJson(users);
System.out.println(json);
List<User> userList = gson.fromJson(json,
new TypeToken<List<User>>() {
}.getType());
System.out.println(userList);
}
val users: List<User> = Gson().fromJson(json, object : TypeToken<List<User>>() {}.type)
Log.d(TAG, "test: $users")
- Gson查看TypeToken的源码
客户端创建一个空的匿名子类,这样做会将类型参数嵌入到匿名类的类型层次结构中,这样我们就可以在运行时重建它,而不用考虑类型擦除。
public class TypeToken<T> {
final Class<? super T> rawType;
final Type type;
final int hashCode;
protected TypeToken() {
this.type = getSuperclassTypeParameter(getClass());
this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
this.hashCode = type.hashCode();
}
static Type getSuperclassTypeParameter(Class<?> subclass) {
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
...
}
使用Kotlin对Gson进行改造实现类的真泛型
- 结合扩展函数和内联函数对Gson进行一次封装
这样就不需要使用TypeToken的匿名类来获取T的实际类型了 - reified只能修饰函数,不能修饰类,可以重载类的构造方法,使其具有真泛型的属性
inline fun <reified T> Gson.fromJson(json: String): T {
return fromJson(json, T::class.java)
}
TypeAdapter核心对象
public abstract class TypeAdapter<T> {
public abstract void write(JsonWriter out, T value) throws IOException;
public abstract T read(JsonReader in) throws IOException;
}
参考资料