1. 序章

このチュートリアルでは、JSONArrayを反復処理する方法を説明します。

まず、forループでそれを実行してみます。 次に、拡張機能を作成してさらに簡単にする方法を見ていきます。

2. JSONArrayを反復処理します

JSONArrayクラスはイテレータ演算子を実装していません。 したがって、通常のfor-eachパターンを使用してJSONArrayを反復することはできません。

代わりに使用できる他のいくつかの方法を見てみましょう。

2.1. for Loopを介した反復

for ループを使用して、JSONArrayを反復処理できます。

val booksJSONArray = JSONArray(BOOKS_STRING)
for (i in 0 until booksJSONArray.length()) {
    val book = booksJSONArray.getJSONObject(i)
    println("${book.get("book_name")} by ${book.get("author")}")
}

for-eachループを使用することもできます。

val booksJSONArray = JSONArray(BOOKS_STRING)
(0 until booksJSONArray.length()).forEach {
    val book = booksJSONArray.getJSONObject(it)
    println("${book.get("book_name")} by ${book.get("author")}")
}

これにより、物事が少し読みやすくなります。 ただし、イテレータを使用するほど直感的ではありません。

2.2. 便利な拡張機能の追加

典型的な反復パターンは次のようになります。

val numbers = arrayListOf(1,2)
for (number in numbers){
    ...
}

ここでは、ArrayListIterableを実装しているため、このパターンを使用できます。 悲しいことに、 JSONArray それを実装していません

ただし、拡張関数を使用してこれを機能させることができます。

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

ここでは、イテレータ演算子をJSONArrayに追加します。 最後に、これにより、通常の方法のようにループできます。

for (book in booksJSONArray) {
    println("${(book as JSONObject).get("book_name")} by ${(book as JSONObject).get("author")}")
}

3. 結論

要約すると、JSONArrayイテレータを公開しません。 上記のように、1つのオプションは for-loopsを使用することです。また、拡張機能を使用してイテレーターで後付けすることもできます。

いつものように、コード例はGitHub利用できます。