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
.
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
}
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.