我正在使用Kotlin和Realm编写Android应用程序。 我有一个JSONArray,我想迭代这个数组中的JSONObjects,以便在Realm数据库类中加载它们:
领域类:
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
错误。
答案 0 :(得分:83)
不幸的是,JsonArray
没有公开迭代器。所以你必须使用索引范围迭代它:
for (i in 0..(persons.length() - 1)) {
val item = persons.getJSONObject(i)
// Your code here
}
答案 1 :(得分:36)
即使某个类没有公开iterator
方法,您仍然可以通过提供扩展函数for
使用iterator
语句对其进行迭代:
operator fun JSONArray.iterator(): Iterator<JSONObject>
= (0 until length()).asSequence().map { get(it) as JSONObject }.iterator()
现在,当您在JSONArray
语句中使用for
时,将调用此扩展来获取迭代器。它创建一系列索引并将每个索引映射到与此索引对应的项目。
我认为需要转换为JSONObject
,因为数组不仅可以包含对象,还可以包含基元和其他数组。 asSequence
调用是以懒惰的方式执行map
操作。
答案 2 :(得分:2)
怎么样
(0..(jsonArray.length()-1)).forEach { i ->
var item = jsonArray.getJSONObject(i)
}
?
答案 3 :(得分:2)
最短的方法是:
(0 until persons.length()).forEach {
val item = persons.getJSONObject(it)
基本上从零到jsonarray长度的范围内,每次取一个数字并将其用作检索当前对象的索引
答案 4 :(得分:0)
for (i in 0 until jsonArray.length()){
//do your stuff
}