web-dev-qa-db-fra.com

Kotlin: Itérer dans un JSONArray

J'écris une application Android à l'aide de Kotlin et de Realm . J'ai un JSONArray et je souhaite parcourir les objets JSON de ce tableau pour les charger dans une classe de base de données Realm:

Classe de royaume:

import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required

open class Person(

        @PrimaryKey open var id: Long = 0,

        @Required
        open var name: String = ""

) : RealmObject() {

}

Le JSONArray:

{
    "persons":[
        {
           "id":0,
           "name":"Biatrix"
        },
        {
           "id":1,
           "name":"Bill"
        },
        {
           "id":2,
           "name":"Oren"
        },
        {
           "id":3,
           "name":"Budd"
        }
    ]
}

J'ai essayé d'itérer comme suit:

for (item : JSONObject in persons) {

}

... mais j'obtiens une erreur for-loop range must have an iterator() method.

39
Ambran

Malheureusement, JsonArray n'expose pas d'itérateur. Il vous faudra donc parcourir cette liste en utilisant une plage d'index:

for (i in 0..(persons.length() - 1)) {
    val item = persons.getJSONObject(i)

    // Your code here
}
70
0x60

Même si une classe n'expose pas de méthode iterator, vous pouvez toujours la parcourir avec une instruction for en fournissant une fonction d'extension iterator:

operator fun JSONArray.iterator(): Iterator<JSONObject> 
    = (0 until length()).asSequence().map { get(it) as JSONObject }.iterator()

Désormais, lorsque vous utilisez JSONArray dans l'instruction for, cette extension est appelée pour obtenir un itérateur. Il crée une plage d'index et mappe chaque index à un élément correspondant à cet index. 

Je suppose que la conversion en JSONObject est requise, car le tableau peut contenir non seulement des objets, mais également des primitives et d’autres tableaux. Et l'appel asSequence est là pour exécuter l'opération map de manière paresseuse.

34
Ilya

Que diriez-vous 

(0..(jsonArray.length()-1)).forEach { i ->
    var item = jsonArray.getJSONObject(i)
}

?

1
Sharif