【问题标题】:Android - GSON lib - Object deserializing ObjectAndroid - GSON 库 - 对象反序列化对象
【发布时间】:2014-02-03 10:05:50
【问题描述】:

当我从 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;
    }
}

如您所见,我不知道“数据”会是哪种类型的数据,所以我在这里使用了 Object 类型。

所以当我得到回复时,我会使用:

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;
    }

一切正常。但我有一个小问题。 “数据”字段可以是所有内容(字符串、整数、JSONObject,...),对于我的示例,当我在这里得到结果时,数据是 JSONObject。所以“数据”(即Object)是一个JSONObject,但在这里自动转换为LinkedTreeMap而不是JSONObject,所以当我想解析“数据”时,我有一个CastException:/

所以这里真正的问题是,如果用户已将 JSONObject 发送到 API,并且当我调用 Web 服务时得到此结果,GSON 会将此 JSONObject 转换为 LinkedTreeMap,但我想检索已发送的相同类型由用户。

有可能吗?

谢谢大家!

J.

【问题讨论】:

    标签: android deserialization gson


    【解决方案1】:

    您可以添加一个通用模型类,其中“数据”是字符串或 Json 对象。

    如果您明确知道“数据”将是什么,这将有所帮助,例如。这将是一个 json 对象..then: (或者可以将其保留为字符串,然后检查代码并相应地映射它)

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多