JsonPath
This commit is contained in:
parent
4e09fad480
commit
d925f33e44
@ -0,0 +1,19 @@
|
|||||||
|
package ru.dbotthepony.kstarbound.util
|
||||||
|
|
||||||
|
class FullJsonPath(val fullPath: String) {
|
||||||
|
init {
|
||||||
|
val delimers = fullPath.count { it == ':' }
|
||||||
|
require(delimers < 2) { "Invalid path: $fullPath" }
|
||||||
|
}
|
||||||
|
|
||||||
|
val path = fullPath.substringBefore(':')
|
||||||
|
val subpath: JsonPath
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (path.any { it == ':' }) {
|
||||||
|
subpath = JsonPath(fullPath.substringAfter(':'))
|
||||||
|
} else {
|
||||||
|
subpath = JsonPath.EMPTY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
96
src/main/kotlin/ru/dbotthepony/kstarbound/util/JsonPath.kt
Normal file
96
src/main/kotlin/ru/dbotthepony/kstarbound/util/JsonPath.kt
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package ru.dbotthepony.kstarbound.util
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList
|
||||||
|
import com.google.gson.JsonArray
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
|
||||||
|
class JsonPath(val path: String) {
|
||||||
|
private class Piece(private val value: String) {
|
||||||
|
private val asNumber = value.toIntOrNull()
|
||||||
|
|
||||||
|
fun navigate(element: JsonElement): JsonElement? {
|
||||||
|
if (element is JsonObject) {
|
||||||
|
return element[value]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element is JsonArray) {
|
||||||
|
if (asNumber == null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return element[asNumber]
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun navigate(element: Any): Any? {
|
||||||
|
if (element is List<*>) {
|
||||||
|
if (asNumber == null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return element.getOrNull(asNumber)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element is Map<*, *>) {
|
||||||
|
return element[value]
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val parts: List<String> = ImmutableList.copyOf(path.split('.'))
|
||||||
|
private val pieces: List<Piece> = ImmutableList.copyOf(parts.map { Piece(it) })
|
||||||
|
|
||||||
|
fun navigate(element: JsonElement): JsonElement? {
|
||||||
|
var current: JsonElement? = element
|
||||||
|
|
||||||
|
for (piece in pieces) {
|
||||||
|
if (current == null)
|
||||||
|
return null
|
||||||
|
|
||||||
|
current = piece.navigate(current)
|
||||||
|
}
|
||||||
|
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
|
||||||
|
fun navigate(element: List<Any>): Any? {
|
||||||
|
var current: Any? = element
|
||||||
|
|
||||||
|
for (piece in pieces) {
|
||||||
|
if (current == null)
|
||||||
|
return null
|
||||||
|
|
||||||
|
current = piece.navigate(current)
|
||||||
|
}
|
||||||
|
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
|
||||||
|
fun navigate(element: Map<Any, Any>): Any? {
|
||||||
|
var current: Any? = element
|
||||||
|
|
||||||
|
for (piece in pieces) {
|
||||||
|
if (current == null)
|
||||||
|
return null
|
||||||
|
|
||||||
|
current = piece.navigate(current)
|
||||||
|
}
|
||||||
|
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
|
||||||
|
val isEmpty: Boolean
|
||||||
|
get() = path.isEmpty()
|
||||||
|
|
||||||
|
val isBlank: Boolean
|
||||||
|
get() = path.isBlank()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val EMPTY = JsonPath("")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user