Kotlin: itérer à travers un JSONArray

J'écris une application Android en utilisant Kotlin et Realm. J'ai un JSONArray, et je veux parcourir les JSONObjects dans ce tableau afin de les charger dans une classe de base de données Realm:

Classe De Domaine:

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 je reçois une erreur for-loop range must have an iterator() method.

33
demandé sur Ambran 2016-03-23 20:16:38

2 réponses

Malheureusement, JsonArray n'expose pas un itérateur. Donc, vous devrez itérer à travers elle en utilisant une plage d'index:

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

    // Your code here
}
55
répondu 0x60 2016-03-23 21:09:27

Même si une classe n'expose pas une méthode iterator, vous pouvez toujours l'itérer avec l'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()

Maintenant, lorsque vous utilisez JSONArray dans for déclaration de cette extension est appelée pour obtenir un itérateur. Il crée une plage d'indices 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 aussi des primitives et d'autres tableaux. Et l'appel asSequence est ici pour exécuter l'opération map d'une manière paresseuse.

32
répondu Ilya 2016-03-23 21:13:58