【问题标题】:Loading a stored json from SharedPreferences从 SharedPreferences 加载存储的 json
【发布时间】:2014-02-18 17:19:54
【问题描述】:

问题

这个问题困扰我很久了。这不是很常见,但它确实不时发生。问题如下:

我在 SharedPreferences 中的 s Gson 序列化对象中保存了一堆用户首选项。这边走, 当我需要对象时,我将它加载到内存中,只调用一次存储。但是,由于某些奇怪的原因,我收到了这个错误:

java.lang.RuntimeException: Unable to resume activity {com.a.b/com.a.b.SomeActivity}: java.lang.RuntimeException: unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}

可以看出,json 没有正确加载,它是一个无效的 json,所以尝试解析它只会引发异常。

一些额外的事实

  • 每个抛出的异常都显示完全相同的 json 解析问题。出于某种原因,这是总是正在加载的字符串:

rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}

  • 这不是“特定于设备的问题”,或者至少我认为是这样。证据:
    如您所见,它并非特定于设备。我也知道它也不是特定于 android 版本的,我们已经从 Android 2.3.64.0.34.1.14.1.24.0.4 记录了这个崩溃

  • 被序列化的类是

    class AppSettings {
    
    private boolean tutorialFinished;
    private boolean googleAuthTutorialFinished;
    private int appVersion;
    private int lastOpenedAppId;
    
    public AppSettings() {
        tutorialFinished = false;
        appVersion = NO_STORED_VERSION;
        googleAuthTutorialFinished = false;
    }
    
    public boolean isTutorialFinished() {
        return tutorialFinished;
    }
    
    public void setTutorialFinished(boolean tutorialFinished) {
        this.tutorialFinished = tutorialFinished;
    }
    
    public void setAppVerions(int appVerions) {
        this.appVersion = appVerions;
    }
    
    public void setGoogleAuthTutorialFinished(boolean googleAuthTutorialFinished) {
        this.googleAuthTutorialFinished = googleAuthTutorialFinished;
    }
    
    /**
     *
     * @return the stored app version or {@link AppSettingsStorage#NO_STORED_VERSION} if none was found
     */
    public int getAppVerions() {
        return appVersion;
    }
    
    public boolean isGoogleAuthTutorialFinished() {
        return googleAuthTutorialFinished;
    }
    
    public int getLastOpenedAppId() {
        return lastOpenedAppId;
    }
    
    public void setLastOpenedAppId(int lastOpenedAppId) {
        this.lastOpenedAppId = lastOpenedAppId;
    }
    
    }
    
  • 用来加载json的方法是:

        private T fromJson(String json) {
                try {
                    return gson.fromJson(json, type);
                } catch (Exception e) {
                    throw new RuntimeException("unable to parse type " + type + " with json: " + json);
                }
            }
    

可能的原因:

【问题讨论】:

    标签: android sharedpreferences gson


    【解决方案1】:

    您是否缺少双引号?

    unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: 
    
    rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}
    

    应该是:

    unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: 
    
    "rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}
    

    【讨论】:

    • 我没有错过双引号,这正是问题所在。当 Gson 序列化 AppSetting 对象时,应该是有效 json 的 json 字符串被加载为无效 json。你看到问题了吗?
    • 对不起。我不同意。您在 json 中所说的字符串根本没有像您在这篇文章中那样正确格式化 JSON。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多