Intereting Posts
BiMap / 2-way hashmap в Котлине Как я могу запускать заливки Kotlin-Script (* .kts) из Gradle? Невозможно инициализировать парсер объектов для модели. Продукты, не найдены приемлемые конструкторы Как создать запрос HQL с использованием полей расширенного класса Применение преобразования к каждому элементу в Single <List <T >> Обновить searchView при удалении андроида запроса Ошибка в android Studio 3.0 при синхронизации градиента. Ошибка. Причина. Не удалось найти допустимый путь сертификации для запрошенной цели. У меня есть 2 xml анимации, как я могу ее отделить? Создание эксклюзивных диапазонов в котлине Как создать функцию расширения в Kotlin, которая работает с классом? Как настроить Jacoco со Spek в мультипроекте? Android Studio 3.0 Canary 1: тесты Kotlin или тесты Java, относящиеся к классам Kotlin, не работают Как создать список с общим аргументом в Котлине elvis в kotlin .. foo.bar?.let(return true) ?: return false Запустите Kotlin REPL из контекста моего проекта Maven?

JSON для HashMap с объектами с использованием Gson

В моем приложении для Android (написанном в Котлине) мне нужно превратить 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, как описано здесь , но я получал ошибку «ожидаемый объект begin, но был строкой».

Есть идеи?

ОБНОВИТЬ

Я также читаю данные 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) .