gpt4 book ai didi

android - 即使在 android 中使用 TypeToken 时也会获取 com.google.gson.JsonSyntaxException?

转载 作者:行者123 更新时间:2023-11-29 22:53:36 35 4
gpt4 key购买 nike

我正在尝试访问我的 Activity 中的 SharedPreferences,我将其存储为 HashMapJSON 字符串,但出现错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.

这是我的代码:

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)
}
}

这是我尝试解析的字符串的日志:

E/test: {"(2, 2)":"English"}

这是完整的日志:

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) 

编辑


这一行也对我显示错误:

Gson().fromJson("{\"(2, 2)\":\"English\"}", object : TypeToken<HashMap<Pair<Int, Int>, String>>(){}.type)

最佳答案

问题是 HashMap<Pair<Int, Int>, String>表示您希望映射键是一对,但根据您记录的 json,它实际上是一个字符串。

您可以使用 enableComplexMapKeySerialization 启用此类映射键的序列化

请注意,序列化 json 的结构会发生变化,如果您已经在共享首选项中存储了某些内容,它将会中断。

关于android - 即使在 android 中使用 TypeToken 时也会获取 com.google.gson.JsonSyntaxException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57650206/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com