67 lines
1.7 KiB
Kotlin
67 lines
1.7 KiB
Kotlin
package exh.util
|
|
|
|
/**
|
|
* Reads entire `JsonObject`s and `JsonArray`s from `JsonReader`s
|
|
*
|
|
* @author nulldev
|
|
*/
|
|
|
|
import com.google.gson.JsonArray
|
|
import com.google.gson.JsonNull
|
|
import com.google.gson.JsonObject
|
|
import com.google.gson.stream.JsonReader
|
|
import com.google.gson.stream.JsonToken
|
|
import java.math.BigDecimal
|
|
|
|
fun JsonReader.nextJsonObject(): JsonObject {
|
|
beginObject()
|
|
|
|
val obj = JsonObject()
|
|
|
|
while(hasNext()) {
|
|
val name = nextName()
|
|
|
|
when(peek()) {
|
|
JsonToken.BEGIN_ARRAY -> obj.add(name, nextJsonArray())
|
|
JsonToken.BEGIN_OBJECT -> obj.add(name, nextJsonObject())
|
|
JsonToken.NULL -> {
|
|
nextNull()
|
|
obj.add(name, JsonNull.INSTANCE)
|
|
}
|
|
JsonToken.BOOLEAN -> obj.addProperty(name, nextBoolean())
|
|
JsonToken.NUMBER -> obj.addProperty(name, BigDecimal(nextString()))
|
|
JsonToken.STRING -> obj.addProperty(name, nextString())
|
|
else -> skipValue()
|
|
}
|
|
}
|
|
|
|
endObject()
|
|
|
|
return obj
|
|
}
|
|
|
|
fun JsonReader.nextJsonArray(): JsonArray {
|
|
beginArray()
|
|
|
|
val arr = JsonArray()
|
|
|
|
while(hasNext()) {
|
|
when(peek()) {
|
|
JsonToken.BEGIN_ARRAY -> arr.add(nextJsonArray())
|
|
JsonToken.BEGIN_OBJECT -> arr.add(nextJsonObject())
|
|
JsonToken.NULL -> {
|
|
nextNull()
|
|
arr.add(JsonNull.INSTANCE)
|
|
}
|
|
JsonToken.BOOLEAN -> arr.add(nextBoolean())
|
|
JsonToken.NUMBER -> arr.add(BigDecimal(nextString()))
|
|
JsonToken.STRING -> arr.add(nextString())
|
|
else -> skipValue()
|
|
}
|
|
}
|
|
|
|
endArray()
|
|
|
|
return arr
|
|
}
|