当我从WS获得结果时,我使用GSON lib来反序列化我的对象。例如,我的Web服务响应包含:
"id" : "myid"
"code" : 200
"data" : can be anything (String, JSONObject, JSONArray...)
所以我的班级:
public class MyClass
{
private Object id;
private int code;
private Object data;
private String type;
public MyClass()
{
}
public String getType()
{
return type;
}
public void setType(String type)
{
this.type = type;
}
public Object getId()
{
return id;
}
public void setId(Object id)
{
this.id = id;
}
public int getCode() {
return code;
}
public Object getData() {
return data;
}
public void setCode(int code) {
this.code = code;
}
public void setData(Object data) {
this.data = data;
}
}
正如您所看到的,我不知道哪种类型的数据“数据”,所以我在这里使用了对象类型。
所以当我得到回应时我会使用:
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
并使用此方法转换我的类:
public <T> T deserialize(Type pClass, JSONObject pJsonObject)
{
try
{
return gson.fromJson(pJsonObject.toString(), pClass);
}
catch (JsonSyntaxException e)
{
}
return null;
}
一切都运作良好。但我有一点问题。 “data”字段可以是所有内容(String,Integer,JSONObject,...),对于我的示例,当我在此处获得结果时,数据是JSONObject。所以“data”(它是Object)是一个JSONObject,但是在这里自动转换为LinkedTreeMap而不是JSONObject,所以当我想解析“data”时,我有一个CastException:/
所以这里真正的问题是如果用户已经向API发送了一个JSONObject,并且当我调用Web服务时得到了这个结果,GSON将这个JSONObject转换为LinkedTreeMap,但我想检索已经发送的相同类型由用户。
有可能吗?
感谢所有人!
学家
答案 0 :(得分:1)
您可以添加通用模型类,其中“data”将是String或Json对象..
如果您确定知道“数据”是什么,将会有所帮助,比如说。它是一个json对象..然后:(或者可以将它保存为String然后检查代码并相应地映射)
private String id;
private int code;
private JsonObject data;
private String type;
并且可以在模型类中使用来自Gson lib的 Annotation :
@SerializedName("responseVariableStringHere")
private String responseVariable;
然后,
modelClassObject = gson.fromJson(responseContentString,ModelClass.class);
之后,
JsonObject job = modelClassObject.getData();
并重复映射过程。这次使用“数据”响应的模型类对象
objectFromData = gson.fromJson(job.get("tagfromtheJsonObject"), ObjectFromData.class);
可以避免写:
public <T> T deserialize(Type pClass, JSONObject pJsonObject)