【发布时间】:2016-04-21 04:02:47
【问题描述】:
我在使用 Gson 解析一些 JSON 时遇到了一个噩梦般的问题。
我试图解析的 Json 结构如下所示:
{ "user_id" : "833", "message" : "User created and registered" }
当我使用以下代码解析 Json 时:
Type response = gson.fromJson(jsonString, new TypeToken<RestResponse>(){}.getType());
我收到以下错误:
java.lang.ClassCastException: ... RestResponse 无法转换为 java.lang.reflect.Type
我正在解析成以下 POJO:
import java.lang.reflect.Type;
public class RestResponse {
private void RestResponse() {
// Constructor required for GSON
}
private StatusCode statusCode;
private String content;
private Object data;
private Type output;
private String user_id;
private String message;
private String error;
public String getUserID() {
return this.user_id;
}
public void setUserID(String user_id) {
this.user_id = user_id;
}
public String getMessage() { return this.message; }
public void setMessage(String message) {
this.message = message;
}
public String getError() { return this.error; }
public void setError(String error) { this.error = error; }
public StatusCode getStatusCode() {
return statusCode;
}
public void setStatusCode(StatusCode statusCode) {
this.statusCode = statusCode;
}
public final String getContent() {
return content;
}
public final void setContent(final String content) {
this.content = content;
}
public final Object getData() {
return data;
}
public final void setData(final Object data) {
this.data = data;
}
public final Type getOutput() {
return output;
}
public final void setOutput(final Type output) {
this.output = output;
}
@Override
public final String toString() {
return String.format("%s", this.content);
}
}
我返回 Type 而不是 RestResponse 对象的原因是因为我根据响应类型的类型调用回调。然后我像这样处理代码:
if (statusCode == StatusCode.SUCCESS) {
if (requestCode == AppConstants.REQUEST_REGISTRATION) {
if (data instanceof RestResponse) {
RestResponse restResponse = (RestResponse) data;
AppDelegate delegate = (AppDelegate) getApplicationContext();
delegate.name = nameText.getText().toString();
delegate.email = emailText.getText().toString();
delegate.mobile = validatedFormattedNum;
delegate.referredID = "";
delegate.isRegistered = 1;
delegate.uid = restResponse.getUserID();
delegate.setInMemory();
} else {
if(data instanceof ApiErrorResponse) {
ApiErrorResponse apiErrorResponse = (ApiErrorResponse) data;
...
...
...
任何人都想看到堆栈跟踪:
E/com.sourgun.http.AppParser: General exception encountered in parse() com.sourgun.http.RestResponse cannot be cast to java.lang.reflect.Type
04-22 12:51:13.748 31779-31779/? W/System.err: java.lang.ClassCastException: com.sourgun.http.RestResponse cannot be cast to java.lang.reflect.Type
04-22 12:51:13.748 31779-31779/? W/System.err: at com.sourgun.http.AppParser.parse(AppParser.java:37)
04-22 12:51:13.749 31779-31779/? W/System.err: at com.sourgun.http.RestController.onResponse(RestController.java:85)
04-22 12:51:13.750 31779-31779/? W/System.err: at com.sourgun.http.AsyncTaskExecutor.onPostExecute(AsyncTaskExecutor.java:66)
04-22 12:51:13.750 31779-31779/? W/System.err: at com.sourgun.http.AsyncTaskExecutor.onPostExecute(AsyncTaskExecutor.java:14)
04-22 12:51:13.751 31779-31779/? W/System.err: at android.os.AsyncTask.finish(AsyncTask.java:651)
04-22 12:51:13.751 31779-31779/? W/System.err: at android.os.AsyncTask.-wrap1(AsyncTask.java)
04-22 12:51:13.752 31779-31779/? W/System.err: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
04-22 12:51:13.753 31779-31779/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
04-22 12:51:13.753 31779-31779/? W/System.err: at android.os.Looper.loop(Looper.java:148)
04-22 12:51:13.754 31779-31779/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5422)
04-22 12:51:13.754 31779-31779/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
04-22 12:51:13.755 31779-31779/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
04-22 12:51:13.755 31779-31779/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
【问题讨论】:
-
什么是
response?它是Type类型的变量吗?为什么? -
对不起,响应是一个类型
-
为什么是
Type?为什么不是RestResponse? -
您对异常消息有什么不明白的地方?
-
所以@Pillar,你认为这是问题所在吗?当我在另一个类中处理响应时,它是一个类型