簡體   English   中英

使用Gson使用對象將JSON轉換為HashMap

[英]JSON to HashMap with objects using 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: : {

不知道為什么。

我不知道你為什么有任何錯誤。 我可以使用以下代碼解析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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM