我的方法适用于 Gson 2.3.1 和 Java 1.7,不能保证它适用于 Android。
问题出在变量上classType
,因为 Gson 无法处理该类型Class
就这样。所以我们必须为Class创建一个TypeAdapter。
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class ClassTypeAdapter extends TypeAdapter<Class<?>> {
@Override
public void write(JsonWriter jsonWriter, Class<?> clazz) throws IOException {
if(clazz == null){
jsonWriter.nullValue();
return;
}
jsonWriter.value(clazz.getName());
}
@Override
public Class<?> read(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
Class<?> clazz = null;
try {
clazz = Class.forName(jsonReader.nextString());
} catch (ClassNotFoundException exception) {
throw new IOException(exception);
}
return clazz;
}
}
为了让它工作,你需要一个 TypeAdapterFactory。
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
public class ClassTypeAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
if(!Class.class.isAssignableFrom(typeToken.getRawType())) {
return null;
}
return (TypeAdapter<T>) new ClassTypeAdapter();
}
}
并将 TypeAdapterFactory 注册到您的 Gson Builder。
gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory());
AFAIK 你必须使用 TypeAdapterFactory。直接注册的TypeAdapter
gsonBuilder.registerTypeAdapter(Class.class, new ClassTypeAdapter());
当类型的对象时似乎被忽略Class
遇到。
Gson 改变了HashMap
以及 Java 类实例到 JSON 对象。
例子:
{
"hash_key_1": {
"jsonString": "json_string_instance_1",
"classType": "my.class.Name1"
},
"hash_key_2": {
"jsonString": "json_string_instance_2",
"classType": "my.class.Name2"
}
}