来自gson的LinkedHashMap从共享首选项返回JsonSyntaxException

时间:2018-01-01 21:29:01

标签: android json

我将共享首选项中的LinkedHashMap保存为JSON,如下所示:

LinkedHashMap<Date, Integer> todayHistoryMap = SharedPreferencesManager.getHistoryWeekPointsMap(context);

Date dateCalled = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);

int pointsForTodayThisWeek = 6;


todayHistoryMap.put(dateCalled, pointsForTodayThisWeek);

final SharedPreferences.Editor editor = getSharedPreferences(context).edit();

Gson gson = new Gson();
String hashMapString = gson.toJson(todayHistoryMap);

editor.putString(JSON_WEEK_HISTORY_POINTS, hashMapString);

Log.d(TAG, "week points history saved: " + hashMapString);

editor.apply();

现在我像这样检索它:

String storedHashMapString = getSharedPreferences(context).getString(JSON_WEEK_HISTORY_POINTS, "none");

Type type = new TypeToken<LinkedHashMap<Date, Integer>>() {
}.getType();

Gson gson = new Gson();

if (!storedHashMapString.equals("none")) {
    try {
        LinkedHashMap<Date, Integer> weekPointsHistoryMap = gson.fromJson(storedHashMapString, type);
        return weekPointsHistoryMap;
    } catch (IllegalStateException | JsonSyntaxException exception) {
        Log.d(TAG, "Json error" + exception);
        return null;
    }
} else return new LinkedHashMap<Date, Integer>();

以下是JSON的示例: {&#34; Sun Dec 31 23:25:01 GMT + 02:00 2017&#34;:1}

现在它总是抛出JsonSyntaxException。我不知道为什么。

由于

1 个答案:

答案 0 :(得分:1)

这是因为Gson不知道您用来存储日期字符串的日期formatJSON示例的日期格式为:

  

“EE MMM d H:m:ss zz y”

当您创建Gson对象以便从JSON解析String时,您应该设置日期格式。 使用此代码:

Gson gson = new GsonBuilder().setDateFormat("EE MMM d H:m:ss zz y").create();

而不是:

Gson gson = new Gson();

尝试在两种方法中更改它。