KotlinとRealmを使用してAndroidアプリを作成しています。
レルムクラス:
_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() {
}
_
JSONArray:
_{
"persons":[
{
"id":0,
"name":"Biatrix"
},
{
"id":1,
"name":"Bill"
},
{
"id":2,
"name":"Oren"
},
{
"id":3,
"name":"Budd"
}
]
}
_
私は次のように繰り返してみました:
_for (item : JSONObject in persons) {
}
_
...しかし、for-loop range must have an iterator() method
エラーが表示されます。
残念ながら、JsonArray
はイテレータを公開しません。そのため、インデックス範囲を使用して繰り返し処理する必要があります。
for (i in 0..(persons.length() - 1)) {
val item = persons.getJSONObject(i)
// Your code here
}
一部のクラスがiterator
メソッドを公開しない場合でも、拡張関数for
を提供することにより、iterator
ステートメントで繰り返し処理できます。
operator fun JSONArray.iterator(): Iterator<JSONObject>
= (0 until length()).asSequence().map { get(it) as JSONObject }.iterator()
JSONArray
ステートメントでfor
を使用すると、イテレータを取得するためにこの拡張機能が呼び出されます。一連のインデックスを作成し、各インデックスをこのインデックスに対応するアイテムにマッピングします。
配列にはオブジェクトだけでなくプリミティブや他の配列も含めることができるため、JSONObject
へのキャストが必要だと思います。 asSequence
呼び出しは、map
操作を怠zyな方法で実行するためにここにあります。
どう?
(0..(jsonArray.length()-1)).forEach { i ->
var item = jsonArray.getJSONObject(i)
}
?
for (i in 0 until jsonArray.length()){
//do your stuff
}