Java JSON反序列化后访问LinkedHashMap中的嵌套对象
我正在尝试访问Java JSON反序列化后访问LinkedHashMap中的嵌套对象,java,json,gson,linkedhashmap,invocationtargetexception,Java,Json,Gson,Linkedhashmap,Invocationtargetexception,我正在尝试访问LinkedHashMap中的对象,但在尝试访问时得到了InvocationTargetException。 LinkedHashMap是使用Gson库从JSON转换为一系列Java对象的结果。对象“列表”包含所有其他元素: public class List{ private Clouds clouds; private Number dt; private String dt_txt; private Main main; private Rain
LinkedHashMap
中的对象,但在尝试访问时得到了InvocationTargetException
。
LinkedHashMap
是使用Gson库从JSON转换为一系列Java对象的结果。对象“列表”包含所有其他元素:
public class List{
private Clouds clouds;
private Number dt;
private String dt_txt;
private Main main;
private Rain rain;
private Sys sys;
private List weather;
private Wind wind;
}
该类还包含getter和setter
当我执行以下操作时:
for(LinkedHashMap l : ArrayList<LinkedHashMap> result.getList()) {
Number dt = (Number) l.get("dt");
}
我将获得一个调用targetException
。有什么想法、建议或窍门吗
编辑:
堆栈跟踪:
09-19 14:37:59.448: E/AndroidRuntime(11192): FATAL EXCEPTION: main
09-19 14:37:59.448: E/AndroidRuntime(11192): java.lang.ClassCastException: com.google.gson.internal.LinkedHashTreeMap cannot be cast to com.censored.weather.Main
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.censored.censored.VenloAppDelegate$GetWeatherTask.onPostExecute(VenloAppDelegate.java:305)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.censored.censored.VenloAppDelegate$GetWeatherTask.onPostExecute(VenloAppDelegate.java:1)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.Looper.loop(Looper.java:153)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.app.ActivityThread.main(ActivityThread.java:5297)
09-19 14:37:59.448: E/AndroidRuntime(11192): at java.lang.reflect.Method.invokeNative(Native Method)
09-19 14:37:59.448: E/AndroidRuntime(11192): at java.lang.reflect.Method.invoke(Method.java:511)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
首先,发布整个堆栈跟踪。其次,
List
对于Java中的类名来说是一个非常危险的选择。第三,我怀疑您的for
循环是否是实际的代码,而不是您为演示而提出的示例;声明语法是怎么回事?是的,for循环只是一小段演示代码,因为实际的源代码相当长和复杂。我知道列表是一个非常危险的选择,但我并没有选择它。这是一个相当大的现有项目。我将发布堆栈跟踪,但我调试了它,并在尝试将l.get('main')分配给main时抛出InvocationTargetException。好的,但是从哪里开始?我怀疑get
调用是否抛出了异常,您的问题的答案可能包含在引擎盖下反射系统试图做的事情中。人为示例没有帮助的部分原因是,我们看不到涉及到什么实际类型来理解get
是如何实现的。所以这几乎肯定是错误的l.get(“main”)
返回的是LinkedHashTreeMap
,而不是您所期望的;我强烈怀疑Main
是一个嵌套的复杂类型,您将其视为一个映射而不是POJO。从该行获得的异常是ClassCastException
,而不是InvocationTargetException
。
09-19 14:37:59.448: E/AndroidRuntime(11192): FATAL EXCEPTION: main
09-19 14:37:59.448: E/AndroidRuntime(11192): java.lang.ClassCastException: com.google.gson.internal.LinkedHashTreeMap cannot be cast to com.censored.weather.Main
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.censored.censored.VenloAppDelegate$GetWeatherTask.onPostExecute(VenloAppDelegate.java:305)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.censored.censored.VenloAppDelegate$GetWeatherTask.onPostExecute(VenloAppDelegate.java:1)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.os.Looper.loop(Looper.java:153)
09-19 14:37:59.448: E/AndroidRuntime(11192): at android.app.ActivityThread.main(ActivityThread.java:5297)
09-19 14:37:59.448: E/AndroidRuntime(11192): at java.lang.reflect.Method.invokeNative(Native Method)
09-19 14:37:59.448: E/AndroidRuntime(11192): at java.lang.reflect.Method.invoke(Method.java:511)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
09-19 14:37:59.448: E/AndroidRuntime(11192): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)