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
错误。
不幸的是, 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
语句中使用JSONArray
时for
会调用这个扩展来获得一个迭代器。 它创建一系列索引,并将每个索引映射到与此索引对应的项目。
我猜想转换为JSONObject
是必需的,因为数组不仅可以包含对象,还可以包含基元和其他数组。 而asSequence
调用是在这里以懒惰的方式执行map
操作。
- anko doAsync onComplete
- Android:工具栏不显示
- 如何解决Gradle的DexArchiveBuilderException?
- 我有一个错误:setOnItemClickListener不能用于微调,什么是错的?
- UserLoginTask完成登录API完成块后,如何返回doInBackground中的结果
- 如何在kotlin-android编译之前处理重复的类?
- 'com.android.tools.build:gradle:3.0.0-alpha3'和'com.android.tools.build:gradle:3.0.0-alpha1'有什么区别?
- Java / Kotlin JSON解析改进
- Base 64编码和解码示例代码