Kotlin:通过JSONArray迭代

我正在使用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错误。

Solutions Collecting From Web of "Kotlin:通过JSONArray迭代"

不幸的是, JsonArray不公开迭代器。 所以你将不得不遍历它使用索引范围:

 for (i in 0..(persons.length() - 1)) { val item = persons.getJSONObject(i) // Your code here } 

即使有些类没有公开iterator方法,仍然可以通过提供一个扩展函数iterator for语句:

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

现在当你在for语句中使用JSONArrayfor会调用这个扩展来得到一个迭代器。 它创build一系列索引,并将每个索引映射到与此索引对应的项目。

我猜想转换为JSONObject是必需的,因为数组不仅可以包含对象,还可以包含基元和其他数组。 而asSequence调用是在这里以懒惰的方式执行map操作。