Android - GSON lib - 对象反序列化对象

时间:2014-02-03 10:05:50

标签: android deserialization gson

当我从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,但我想检索已经发送的相同类型由用户。

有可能吗?

感谢所有人!

学家

1 个答案:

答案 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)