我目前正在为我的Android应用程序使用基本JSON lib来提取从我们的服务器发送的JSON。为了提高性能,我想搬到Gson。
目前我因为以下原因而无法进行反序列化 -
我的班级 -
public class GameResponse {
public boolean failed = false;
public Object jsonObject; // Type cast this object based on the class type passed in json string
}
public class GameBatchResponse {
public GameResponse[] gameResponses;
}
反序列化我的jsonresponse -
Gson gson = new Gson();
GameBatchResponse response = gson.fromJson(jsonResponse, GameBatchResponse.class);
现在,如何告诉Gson需要键入哪个类来强制转换JsonObject。目前它正在将它转换为LinkedTreeMap,因为它不知道它需要键入哪个类来投射它。
当我(MyClass)response.gameResponses[0].jsonObject
时,它会给出类强制转换异常。
在当前的实现中,我曾经在我的Json字符串中传递@type,并将使用它来创建MyClass的实例。对于例如 - “@type”:“com.mypackage.MyClass”
我正在寻找相同逻辑的Gson实现,我可以在运行时从JSON字符串中附加的信息告诉Gson类类型
答案 0 :(得分:0)
尝试这个
public static Object createObjectFromJSON(String jsonString, Map<Class, AbstractAdapter>map,Class classType) {
GsonBuilder builder = new GsonBuilder();
if(map!=null) {
for (Entry<Class, AbstractAdapter> entry : map.entrySet()) {
builder.registerTypeAdapter(entry.getKey(), entry.getValue());
}
}
builder.setPrettyPrinting();
builder.serializeNulls();
Gson gsonExt = builder.create();
return gsonExt.fromJson(jsonString, classType);
}
您必须定义自己的AbstractAdapter类
public class Adapter extends AbstractAdapter{
@Override
public AbstractSureCallDataFile deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
JsonPrimitive prim = (JsonPrimitive) jsonObject.get(AbstractAdapter.CLASSNAME);
String className = prim.getAsString();
Class<?> klass = null;
try {
klass = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new JsonParseException(e.getMessage());
}
return context.deserialize(jsonObject.get(AbstractAdapter.INSTANCE), klass);
}
@Override
public JsonElement serialize(Serializable src, Type typeOfSrc,
JsonSerializationContext context) {
JsonObject retValue = new JsonObject();
String className = src.getClass().getCanonicalName();
retValue.addProperty(AbstractAdapter.CLASSNAME, className);
JsonElement elem = context.serialize(src);
retValue.add(AbstractAdapter.INSTANCE, elem);
return retValue;
}
}
并致电
Map<Class, AbstractAdapter> map=new HashMap<>();
map.put(Xyz.class, new Adapter());
Object obj= createObjectFromJSON(line, map, MainObjectClass.class);