Gson无法强制转换对象

时间:2016-03-28 08:04:12

标签: android gson

我将请求网络调用到我的服务器,服务器总是响应格式json,如下所示:

{

   "error": 200,
   "message": "Login Success",
   "message_app": "abcxyz",
   "data": {
     "client_id": "1423423",
     "client_secret": "64646456546"
   }
 } 

只有jsonObject 数据包含每种请求的不同字段。 新响应的示例:

{

   "error": 200,
   "message": "Get product success",
   "message_app": "vcxvxcv",
   "data": {
     "product_title": "Product A",
     "product_desc": "This is a description for product A"
   }
 } 

所以我决定做一个通用类调用ServerResult包含一个字段“Object”,这样我就可以将它强制转换为特定的对象。

// ServerResult.class

public class ServerResult {
    private int error;
    private String message;
    private String message_app;
    private Object data;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessageApp() {
        return message_app;
    }

    public void setMessageApp(String messageApp) {
        this.message_app = messageApp;
    }

    public int getError() {
        return error;
    }

    public void setError(int error) {
        this.error = error;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage_app() {
        return message_app;
    }

    public void setMessage_app(String message_app) {
        this.message_app = message_app;
    }
}

// Client.java

public class Client {

    private String client_id;
    private String client_secret;

    public String getClientId() {
        return client_id;
    }

    public void setClientId(String client_id) {
        this.client_id = client_id;
    }

    public String getClientSecret() {
        return client_secret;
    }

    public void setClientSecret(String client_secret) {
        this.client_secret = client_secret;
    }
}

请求完成后,我通过GSON将json转换为ServerResult对象:

@Override    
  public void onResponse(String response) {              
     Gson gson = new Gson();
     ServerResult serverResult = gson.fromJson(response, ServerResult.class); //convert json String to ServerResult object

  }

然后将Data对象转换为Client对象

Client client = (Client)serverResult.getData(); // problem here

来自GSON的日志错误:

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为mypackagename.Client

问题与GSON有关吗?

3 个答案:

答案 0 :(得分:1)

不幸的是,它不能那样工作。 正如您所写,您的data字段可能会有不同的内容(即不同的类别),具体取决于请求。

所有Gson都能看到object data中的ServerResult字段。 Gson如何知道数据对象中隐藏了哪种确切类型的对象(例如你的Client类)? Gson不会检查您代码中的所有可用类,只是“尝试投射它”。

答案 1 :(得分:1)

您可以做的是声明数据'字段为com.google.gson.JsonObject类型,并通过检查其内容来手动解析。

例如:

JsonObject data = serverResult.getData();
if (data.has("client_id")) {
    //parse it as Client
} else {
    //parse it as another type
}

答案 2 :(得分:0)

gson解析您的json数据时。 gson字段无法知道您的data字段包含client dataproduct data,因为您还没有指定任何特定对象。因此gson会将该数据字段转换为地图对象。

您可以尝试以下方法。

更改您的ServerResult,如下所示。

public class ServerResult {
    private int error;
    private String message;
    private String message_app;
    private Map<String, String> data;
}

现在创建util方法以从Client获取Map数据。

public static Client getClient(Map<String, String> data){
    Client client = new Client();
    client.setClientId(data.get("client_id"));
    client.setClientSecret(data.get("client_secret"));
    return client;
}

现在使用它像..

@Override    
public void onResponse(String response) {              
    Gson gson = new Gson();
    ServerResult serverResult = gson.fromJson(response, ServerResult.class); //convert json String to ServerResult object
    Client client = getClient(serverResult.getData());
}

同样,您也可以从同一个ServerResult对象获取产品数据。无需创建不同的解析器类。