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

Why is my LinkedHashMap being incorrectly converted to JSON and saved in SharedPreferences?

我试图在 SharedPreferences 中保存一个对象,但首先将该对象转换为 JSON,如下所示。但是,该对象被错误地转换和保存。

    private void saveSchedule() {
        String jsonString = new Gson().toJson(schedule);
        SharedPreferences sharedPreferences = getSharedPreferences("Schedule", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("schedule", jsonString);
        editor.apply();
    }

JSON 看起来像这样:

E/ {"com.example.****.****.HobbyApp@a64232":["Hobby1","Hobby2","Hobby3"]}

这使得无法保存和检索日程安排。

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

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

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

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