24

I am not able to convert a JSON Array into a GroupModel array. Below is the JSON I used:

[{
  "description":"My expense to others",
  "items":["aaa","bbb"],
  "name":"My Expense"
 },
 {
  "description":"My expense to others","
  items":["aaa","bbb"],
  "name":"My Expense"
 }]

and the GroupModel class is:

class GroupModel {
    var name: String? = null
    var description: String? = null
    var items: MutableList<String>? = null

    constructor(name: String, description: String, items: MutableList<String>) {
        this.name = name
        this.description = description
        this.items = items
    }
}

and trying the following code results in an Exception:

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

The code:

var model = gson.fromJson<Array<GroupModel>>(inputString, GroupModel::class.java)
0

3 Answers 3

27
[{
  "description":"My expense to others",
  "items":["aaa","bbb"],
  "name":"My Expense"
 },
 {
  "description":"My expense to others","
  items":["aaa","bbb"],
  "name":"My Expense"
 }]

Kotlin Code

val gson = GsonBuilder().create()
val Model= gson.fromJson(body,Array<GroupModel>::class.java).toList()

Gradle

implementation 'com.google.code.gson:gson:2.8.5'
Sign up to request clarification or add additional context in comments.

Comments

17

I have found a solution that is actually working on Android with Kotlin for parsing JSON arrays of a given class. The solution of @Aravindraj didn't really work for me.

val fileData = "your_json_string"
val gson = GsonBuilder().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.java).toList()

So basically, you only need to provide a class (YourClass in the example) and the JSON string. GSON will figure out the rest.

The Gradle dependency is:

implementation 'com.google.code.gson:gson:2.8.6'

Comments

10

You need to use a TypeToken to capture the generic type of the array, and you need this to be the type that GSON sees as the target, instead of just GroupModel::class it is really a list of those. You can create a TypeToken and use it as follows:

Type groupListType = new TypeToken<ArrayList<GroupModel>>() {}.getType();
var model = gson.fromJson(inputString, groupListType);

2 Comments

This should not be the accepted answer. This answer does not work. The below 2 answer works correctly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.