Refactor json utilities
parent
166c5be5d6
commit
08fe54c36d
@ -0,0 +1,25 @@
|
|||||||
|
package org.koitharu.kotatsu.parsers.util.json
|
||||||
|
|
||||||
|
import org.json.JSONArray
|
||||||
|
|
||||||
|
internal class JSONArrayTypedIterator<T : Any>(
|
||||||
|
private val array: JSONArray,
|
||||||
|
private val typeClass: Class<T>,
|
||||||
|
startIndex: Int,
|
||||||
|
) : ListIterator<T> {
|
||||||
|
|
||||||
|
private val total = array.length()
|
||||||
|
private var index = startIndex
|
||||||
|
|
||||||
|
override fun hasNext() = index < total
|
||||||
|
|
||||||
|
override fun next(): T = typeClass.cast(array[index++])
|
||||||
|
|
||||||
|
override fun hasPrevious(): Boolean = index > 0
|
||||||
|
|
||||||
|
override fun nextIndex(): Int = index + 1
|
||||||
|
|
||||||
|
override fun previous(): T = typeClass.cast(array[index--])
|
||||||
|
|
||||||
|
override fun previousIndex(): Int = index - 1
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package org.koitharu.kotatsu.parsers.util.json
|
||||||
|
|
||||||
|
import org.json.JSONArray
|
||||||
|
|
||||||
|
internal class JSONArrayTypedListWrapper<T : Any>(
|
||||||
|
private val jsonArray: JSONArray,
|
||||||
|
private val typeClass: Class<T>,
|
||||||
|
) : List<T> {
|
||||||
|
|
||||||
|
override fun contains(element: T): Boolean = indexOf(element) != -1
|
||||||
|
|
||||||
|
override fun containsAll(elements: Collection<T>): Boolean = elements.all { contains(it) }
|
||||||
|
|
||||||
|
override fun get(index: Int): T = typeClass.cast(jsonArray[index])
|
||||||
|
|
||||||
|
override fun indexOf(element: T): Int {
|
||||||
|
repeat(jsonArray.length()) { i ->
|
||||||
|
if (jsonArray[i] == element) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isEmpty(): Boolean = jsonArray.length() == 0
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<T> = listIterator(0)
|
||||||
|
|
||||||
|
override fun lastIndexOf(element: T): Int {
|
||||||
|
val total = jsonArray.length()
|
||||||
|
repeat(total) { i ->
|
||||||
|
if (jsonArray[total - i - 1] == element) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun listIterator(): ListIterator<T> = listIterator(0)
|
||||||
|
|
||||||
|
override fun listIterator(index: Int): ListIterator<T> = JSONArrayTypedIterator(jsonArray, typeClass, index)
|
||||||
|
|
||||||
|
override fun subList(fromIndex: Int, toIndex: Int): List<T> {
|
||||||
|
val result = ArrayList<T>(toIndex - fromIndex + 1)
|
||||||
|
for (i in fromIndex..toIndex) {
|
||||||
|
result.add(get(i))
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
override val size: Int
|
||||||
|
get() = jsonArray.length()
|
||||||
|
}
|
||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.util.json
|
|
||||||
|
|
||||||
import org.json.JSONArray
|
|
||||||
import org.json.JSONObject
|
|
||||||
|
|
||||||
class JSONIterator(private val array: JSONArray) : Iterator<JSONObject> {
|
|
||||||
|
|
||||||
private val total = array.length()
|
|
||||||
private var index = 0
|
|
||||||
|
|
||||||
override fun hasNext() = index < total
|
|
||||||
|
|
||||||
override fun next(): JSONObject = array.getJSONObject(index++)
|
|
||||||
}
|
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package org.koitharu.kotatsu.parsers.util.json
|
||||||
|
|
||||||
|
import org.json.JSONObject
|
||||||
|
|
||||||
|
internal class JSONObjectTypedIterableWrapper<T : Any>(
|
||||||
|
private val json: JSONObject,
|
||||||
|
private val typeClass: Class<T>,
|
||||||
|
) : Iterable<Map.Entry<String, T>> {
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<Map.Entry<String, T>> = IteratorImpl()
|
||||||
|
|
||||||
|
private inner class IteratorImpl : Iterator<Map.Entry<String, T>> {
|
||||||
|
|
||||||
|
private val keyIterator = json.keys().iterator()
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean = keyIterator.hasNext()
|
||||||
|
|
||||||
|
override fun next(): Map.Entry<String, T> = keyIterator.next().let { key ->
|
||||||
|
JSONEntry(key, typeClass.cast(json.get(key)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class JSONEntry<T : Any>(override val key: String, override val value: T) : Map.Entry<String, T>
|
||||||
|
}
|
||||||
@ -1,13 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.util.json
|
|
||||||
|
|
||||||
import org.json.JSONArray
|
|
||||||
|
|
||||||
class JSONStringIterator(private val array: JSONArray) : Iterator<String> {
|
|
||||||
|
|
||||||
private val total = array.length()
|
|
||||||
private var index = 0
|
|
||||||
|
|
||||||
override fun hasNext() = index < total
|
|
||||||
|
|
||||||
override fun next(): String = array.getString(index++)
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.util.json
|
|
||||||
|
|
||||||
import org.json.JSONArray
|
|
||||||
|
|
||||||
class JSONTypedIterator<T>(
|
|
||||||
private val array: JSONArray,
|
|
||||||
private val cls: Class<T>,
|
|
||||||
) : Iterator<T> {
|
|
||||||
|
|
||||||
private val total = array.length()
|
|
||||||
private var index = 0
|
|
||||||
|
|
||||||
override fun hasNext() = index < total
|
|
||||||
|
|
||||||
override fun next(): T {
|
|
||||||
return cls.cast(array.get(index++))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.parsers.util.json
|
|
||||||
|
|
||||||
import org.json.JSONObject
|
|
||||||
|
|
||||||
class JSONValuesIterator(
|
|
||||||
private val jo: JSONObject,
|
|
||||||
) : Iterator<Any> {
|
|
||||||
|
|
||||||
private val keyIterator = jo.keys()
|
|
||||||
|
|
||||||
override fun hasNext(): Boolean = keyIterator.hasNext()
|
|
||||||
|
|
||||||
override fun next(): Any {
|
|
||||||
val key = keyIterator.next()
|
|
||||||
return jo.get(key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue