Akshdeep Singh
Akshdeep Singh

Reputation: 1447

Getting com.google.gson.JsonSyntaxException even when using TypeToken in android?

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) 

EDIT


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

Answers (1)

Fred
Fred

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

Related Questions