Reputation: 1447
I am trying to access SharedPreferences
in my activity which I have stored as JSON
strings of HashMap
, but I am getting the error:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.
This is my code:
private fun getTTROTData(grade: Int): HashMap<Pair<Int, Int>, String> {
val ttrotPrefs = getSharedPreferences("TTROT", Context.MODE_PRIVATE)
val ttrotString = ttrotPrefs.getString(grade.toString(), null)
Log.e("test", ttrotString)
return if (ttrotString == null) HashMap() else {
Gson().fromJson(ttrotString, object : TypeToken<HashMap<Pair<Int, Int>, String>>(){}.type)
}
}
This is the log of the string I am trying to parse:
E/test: {"(2, 2)":"English"}
This is the complete log:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:186)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.Gson.fromJson(Gson.java:927)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at tta.activities.TimeTableROT.getTTROTData(TimeTableROT.kt:91)
at tta.activities.TimeTableROT.onShowTimeTable(TimeTableROT.kt:60)
at tta.activities.TimeTableROT.onSelectClass(TimeTableROT.kt:50)
at tta.fragments.rot.ROTClasses.onListItemClick(ROTClasses.kt:43)
at androidx.fragment.app.ListFragment$2.onItemClick(ListFragment.java:63)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1192)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3169)
at android.os.Handler.handleCallback(Handler.java:874)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:186)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.Gson.fromJson(Gson.java:927)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at tta.activities.TimeTableROT.getTTROTData(TimeTableROT.kt:91)
at tta.activities.TimeTableROT.onShowTimeTable(TimeTableROT.kt:60)
at tta.activities.TimeTableROT.onSelectClass(TimeTableROT.kt:50)
at tta.fragments.rot.ROTClasses.onListItemClick(ROTClasses.kt:43)
at androidx.fragment.app.ListFragment$2.onItemClick(ListFragment.java:63)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1192)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3169)
at android.os.Handler.handleCallback(Handler.java:874)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
this line is also showing error for me:
Gson().fromJson("{\"(2, 2)\":\"English\"}", object : TypeToken<HashMap<Pair<Int, Int>, String>>(){}.type)
Upvotes: 1
Views: 714
Reputation: 17095
The problem is that HashMap<Pair<Int, Int>, String>
is indicating that you want the map key to be a pair, but according to your logged json it's actually a string.
You can enable the serialization of such a map key using enableComplexMapKeySerialization
Careful that the structure of the serialized json changes and if you already have something stored in the shared preferences it will break.
Upvotes: 1