我将请求网络调用到我的服务器,服务器总是响应格式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有关吗?
答案 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 data
或product 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
对象获取产品数据。无需创建不同的解析器类。