Danil
Danil

Reputation: 165

Gson parse Json

How i can parse this json using GSON?

[
 [
   456239452,180279471,"fsdgdfgdfg","T",
   "M",244,0,0,"",0,82,"","[]","fgfdgdfg",10
 ],
 [
   456239451,180279471,"9wnntiu5vu9mBeDiBej4swfcztjOS4nJe",
   "R","s",253,0,0,"",0,82,"","[]","cf46","g",14
 ]
]

My code:

data class Data(val list: List<List<String>>)

Gson().fromJson(json, Data::class.java).let {
    it.list.forEach {
        it.forEach {
            println(it)
        }
    }
}

My stacktrace

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) 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 com.google.gson.Gson.fromJson(Gson.java:774) at dchistov.vkmusic.music.MusicFragment$initAudio$1.doResume(MusicFragment.kt:58) at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:54) at kotlinx.coroutines.experimental.DispatchedTask$DefaultImpls.run(Dispatched.kt:161) at kotlinx.coroutines.experimental.DispatchedContinuation.run(Dispatched.kt:25) at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:285) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1152) at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1990) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1938) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) 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 com.google.gson.Gson.fromJson(Gson.java:774)  at dchistov.vkmusic.music.MusicFragment$initAudio$1.doResume(MusicFragment.kt:58)  at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:54)  at kotlinx.coroutines.experimental.DispatchedTask$DefaultImpls.run(Dispatched.kt:161)  at kotlinx.coroutines.experimental.DispatchedContinuation.run(Dispatched.kt:25)  at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412)  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:285)  at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1152)  at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1990)  at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1938)  at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) 

Upvotes: 0

Views: 503

Answers (1)

asm0dey
asm0dey

Reputation: 2931

Looks like the only thing you can do — it to parse it as List<List<Any>> and then access elements by indices.

To achieve this you should do something like

import java.lang.reflect.Type
import com.google.gson.reflect.TypeToken

Type listType = object: TypeToken<List<List<Any>>>(){}.type
List<List<Any>> list = Gson().fromJson(jsonArray, listType)

Upvotes: 1

Related Questions