Kotlin과 Realm을 사용하여 Android 앱을 작성하고 있습니다. JSONArray가 있고 Realm 데이터베이스 클래스에로드하기 위해이 배열의 JSONObject를 반복하고 싶습니다.
영역 클래스 :
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 until persons.length()) {
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
in for
문 을 사용할 때이 확장이 호출되어 반복자를 가져옵니다. 인덱스 범위를 만들고 각 인덱스를이 인덱스에 해당하는 항목에 매핑합니다.
JSONObject
배열에는 객체뿐만 아니라 기본 요소 및 기타 배열도 포함될 수 있으므로 캐스트 가 필요하다고 생각합니다 . 그리고 게으른 방식으로 작업 asSequence
을 실행하라는 호출이 여기에 map
있습니다.
일반적인 방법 ( 모든 배열 항목이 동일한 유형 이라고 가정 )
@Suppress("UNCHECKED_CAST")
operator fun <T> JSONArray.iterator(): Iterator<T>
= (0 until length()).asSequence().map { get(it) as T }.iterator()
답변
어때
(0..(jsonArray.length()-1)).forEach { i ->
var item = jsonArray.getJSONObject(i)
}
?
답변
for (i in 0 until jsonArray.length()){
//do your stuff
}
답변
가장 짧은 방법은 다음과 같습니다.
(0 until persons.length()).forEach {
val item = persons.getJSONObject(it)
기본적으로 0에서 jsonarray 길이까지의 범위에서 한 번에 하나의 숫자를 취하고 현재 객체를 검색하는 인덱스로 사용합니다.