为啥我的 LinkedHashMap 被错误地转换为 JSON 并保存在 SharedPreferences 中?

Posted

技术标签:

【中文标题】为啥我的 LinkedHashMap 被错误地转换为 JSON 并保存在 SharedPreferences 中?【英文标题】:Why is my LinkedHashMap being incorrectly converted to JSON and saved in SharedPreferences?为什么我的 LinkedHashMap 被错误地转换为 JSON 并保存在 SharedPreferences 中? 【发布时间】:2022-01-18 23:29:37 【问题描述】:

我正在尝试在 SharedPreferences 中保存一个对象,但首先将该对象转换为 JSON,如下所示。但是,对象的转换和保存均不正确。

    private void saveHobbySchedule() 
        String jsonString = new Gson().toJson(hobbySchedule);
        Log.e("Saving Hobby Schedule: ", jsonString);
        SharedPreferences sharedPreferences = getSharedPreferences("UserData", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("hobbySchedule", jsonString);
        editor.apply();
    

JSON 看起来像这样:

E/Saving Hobby Schedule:: "com.example.hobbie.ObjectModels.Hobby@a64126":["MONDAY @ 15:36","WEDNESDAY @ 15:36","THURSDAY @ 15:36"]

这使得无法保存和检索hobbySchedule 变量。

如果有帮助,hobbySchedule 会像这样声明和初始化:

LinkedHashMap<Hobby, ArrayList<String>> hobbySchedule = new LinkedHashMap<>();

这也是 Hobby 类的代码。

public class Hobby implements Serializable 
    private final String hobbyName;
    private final String hobbyEmoji;
    private final String hobbyCategory;
    private final String hobbyDescription;
    private final String hobbyShortDescription;
    private final String hobbyPracticeLocation;
    private final String hobbyImageURL;

    public Hobby() 
        this.hobbyName = "";
        this.hobbyEmoji = "";
        this.hobbyCategory = "";
        this.hobbyDescription = "";
        this.hobbyShortDescription = "";
        this.hobbyPracticeLocation = "";
        this.hobbyImageURL = "";
    

    public Hobby(String hobbyName, String hobbyEmoji, String hobbyCategory, String hobbyDescription,
                 String hobbyShortDescription, String hobbyPracticeLocation, String hobbyImageURL) 
        this.hobbyName = hobbyName;
        this.hobbyEmoji = hobbyEmoji;
        this.hobbyCategory = hobbyCategory;
        this.hobbyDescription = hobbyDescription;
        this.hobbyShortDescription = hobbyShortDescription;
        this.hobbyPracticeLocation = hobbyPracticeLocation;
        this.hobbyImageURL = hobbyImageURL;
    

为什么将Hobby文件地址的名称转换为JSON并保存而不是值?请帮忙,谢谢!

【问题讨论】:

【参考方案1】:

JSON 仅支持字符串作为 JSON 对象属性名称。因此,Gson 默认调用toString() 方法将非字符串Map 键转换为字符串。

如果您的Hobby 类的实例可以很容易地表示为字符串,您可以覆盖它的toString() 方法。但是,对于反序列化,您可能必须注册一个自定义 TypeAdapter

否则,您可以使用 GsonBuilder.enableComplexMapKeySerialization() 将您的 Map 序列化为 JSON 数组。

【讨论】:

以上是关于为啥我的 LinkedHashMap 被错误地转换为 JSON 并保存在 SharedPreferences 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在java中的linkedHashMap中放置空键[关闭]

为啥表格视图单元格中的自动布局会导致表格的内容大小被错误地更改?

类 java.util.LinkedHashMap 不能转换为类 [...]

如何将 Scala Spark Dataframe 转换为 LinkedHashMap[String, String]

java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 com.testing.models.Account

为啥我的 php 标签被转换为 html 注释?