JSON到HashMap与使用Gson的对象

在我的Android应用程序(用Kotlin编写)中,我需要将一些JSON转换为MainObject哈希映射的字符串。 这就是JSON的样子:

{ "a": { "name": "A", "some_int": "2", "some_string": "string", "some_bool": false, "some_string_arr": [ "str1", "str2" ], "sub_obj_arr": [ { "obj_name": "d", "some_obj_string": "s" } ] }, "b": { "name": "B", "some_int": "4", "some_string": "string", "some_bool": false, "some_string_arr": [ "str5", "str6" ] } } 

我创建了一些对象来帮助解决这个问题。

 class MainObject { @SerializedName("name") val name: String? = null @SerializedName("some_int") val someInt: Int? = null @SerializedName("some_string") val someString: String? = null @SerializedName("some_bool") val someBool: Boolean = false @SerializedName("some_string_arr") val someStringArr: List<String>? = null @SerializedName("sub_obj_arr") val someObjArr: List<SubObject>? = null } class SubObject { @SerializedName("obj_name") val objName: String? = null @SerializedName("some_obj_string") val someObjString: String? = null } 

我如何将其转换为HashMap<String, MainObject> ? 我尝试使用这里描述的TypeToken,但我得到错误“预期的开始对象,但是是字符串”。

有任何想法吗?

UPDATE

我也通过这里描述的解决方案在本地读取JSON数据

错误日志

 10-15 20:06:42.771 10328-10328/xxx E/AndroidRuntime: FATAL EXCEPTION: main Process: xxx, PID: 10328 java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ at com.google.gson.Gson.fromJson(Gson.java:900) at com.google.gson.Gson.fromJson(Gson.java:853) at com.google.gson.Gson.fromJson(Gson.java:802) at xxx.onCreate(BottomNavigation.kt:48) at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:183) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) at com.google.gson.Gson.fromJson(Gson.java:888) at com.google.gson.Gson.fromJson(Gson.java:853) at com.google.gson.Gson.fromJson(Gson.java:802) at xxx.onCreate(BottomNavigation.kt:48) at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

更新2

实际问题是我在我的本地JSON文件阅读的方式有问题。 我使用的代码是这样的:

 val input = this.resources.openRawResource(R.raw.json) val json = try { val size = input.available() val buffer = ByteArray(size) input.read(buffer) input.close() String(buffer) } catch (ex: IOException) { ex.printStackTrace() null } 

当我打印出JSON到控制台时,这给我这些怪异的字符:

10-15 23:55:11.911 3351-3351 / xxx I / System.out: {

10-15 23:55:11.911 3351-3351 / xxx I / System.out: “ a ” : {

不知道为什么。

我不知道为什么你有任何错误。 我能够用下面的代码解析JSON。

 val gson = GsonBuilder().create() val type = object:TypeToken<Map<String, MainObject>>(){}.type val result = gson.fromJson<Map<String, MainObject>>("{ \"a\": { \"name\": \"A\", \"some_int\": \"2\", \"some_string\": \"string\", \"some_bool\": false, \"some_string_arr\": [ \"str1\", \"str2\" ], \"sub_obj_arr\": [ { \"obj_name\": \"d\", \"some_obj_string\": \"s\" } ] }, \"b\": { \"name\": \"B\", \"some_int\": \"4\", \"some_string\": \"string\", \"some_bool\": false, \"some_string_arr\": [ \"str5\", \"str6\" ] } }", type) 

好的,在别人的帮助下,我发现问题不在于Gson或我的JSON或任何东西。 这是我读到记忆中的方式。 我使用的代码是:

 val input = this.resources.openRawResource(R.raw.json) val json = try { val size = input.available() val buffer = ByteArray(size) input.read(buffer) input.close() String(buffer) } catch (ex: IOException) { ex.printStackTrace() null } 

但是, String(buffer)默认使用UTF_8字符​​集。 为了使我的工作,我需要使用UTF_16字符集。 工作变化是使用String(buffer, Charsets.UTF_16)