将 JsonString 转换为自定义的 java ArrayList

Posted

技术标签:

【中文标题】将 JsonString 转换为自定义的 java ArrayList【英文标题】:Convert JsonString to a custom java ArrayList 【发布时间】:2014-01-17 20:06:33 【问题描述】:

我的问题是,如何将保存的 Json Sting 转换回自定义 ArrayList。

这就是我保存 ArrayList 的方式:

public void saveLocList(ArrayList<LocItem> locList) 
    SharedPreferences.Editor e = returnPref.edit();
    Gson gson = new Gson();
    String json = gson.toJson(locList);
    e.putString(LOCLIST, json);
    e.commit();

现在,当我恢复 ArrayList(Json 字符串)时,它不适用于此代码:

public ArrayList<LocItem> getLocList() 
    String json = returnPref.getString(LOCLIST, "");
    Type type = (Type) new TypeToken<ArrayList<LocItem>>() 
    .getType();
    ArrayList<LocItem> inpList = new Gson().fromJson(json, (java.lang.reflect.Type) type);
    return inpList;

这是我的日志:

12-30 22:19:19.395: E/androidRuntime(2254): FATAL EXCEPTION: main
12-30 22:19:19.395: E/AndroidRuntime(2254): java.lang.RuntimeException: Unable to start activity ComponentInfomypackagename.MainActivity: java.lang.ClassCastException: com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl cannot be cast to android.renderscript.Type
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread.access$600(ActivityThread.java:153)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.os.Looper.loop(Looper.java:137)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread.main(ActivityThread.java:5289)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at java.lang.reflect.Method.invokeNative(Native Method)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at java.lang.reflect.Method.invoke(Method.java:525)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at dalvik.system.NativeStart.main(Native Method)
12-30 22:19:19.395: E/AndroidRuntime(2254): Caused by: java.lang.ClassCastException: com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl cannot be cast to android.renderscript.Type
12-30 22:19:19.395: E/AndroidRuntime(2254):     at mypackagename.helper.Preferences.getLocList(Preferences.java:152)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at mypackagename.MainActivity.onCreate(MainActivity.java:137)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.Activity.performCreate(Activity.java:5133)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-30 22:19:19.395: E/AndroidRuntime(2254):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
12-30 22:19:19.395: E/AndroidRuntime(2254):     ... 11 more

不知道改什么,可能是保存格式有问题(但可以用);

谢谢

【问题讨论】:

如果你不告诉我们哪里出了问题,我们怎么知道。 【参考方案1】:

错误消息告诉您这是投射问题。

TypeToken.getType()返回一个类ParameterizedTypeImpl的对象,它实现了java.lang.reflect.Type

但是,由于我假设您有 android.renderscript.Type 的导入语句,Java 正试图将 ParameterizedTypeImpl 转换为 android.renderscript.Type

只需修复导入语句或使用完全限定名称 (java.lang.reflect.Type),就像您稍后在代码中所做的那样。

【讨论】:

感谢您并为这个愚蠢的问题感到抱歉,我没有完全阅读日志。

以上是关于将 JsonString 转换为自定义的 java ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

如何将 LinkedHashMap 转换为自定义 java 对象?

如何将 dmesg 时间戳转换为自定义日期格式?

如何将 QTableWidgetItem 转换为自定义子类

将 PySpark 命令转换为自定义函数

将 JSON 转换为自定义对象时出错

如何将自定义 json 转换为自适应卡片 json 格式