jlleitschuh
09/12/2018, 8:16 PMJsonObject
data type in just under 10 seconds on average.
class KlaxonDeserializer : JsonDeserializer<JsonObject>() {
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): JsonObject {
val node: JsonNode = p.codec.readTree(p)
return json { parseJsonObject(node) }
}
private fun KlaxonJson.parseJsonObject(node: JsonNode): JsonObject {
val pairs =
node
.fields()
.asSequence()
.map { it.key to parseValue(it.value) }
.toList()
.toTypedArray()
return obj(*pairs)
}
private fun KlaxonJson.parseJsonArray(node: JsonNode): JsonArray<*> {
val list =
node
.elements()
.asSequence()
.map { parseValue(it) }
.toList()
return array(list)
}
private fun KlaxonJson.parseValue(node: JsonNode): Any? {
return when {
node.isTextual -> node.asText()
node.isObject -> parseJsonObject(node)
node.isArray -> parseJsonArray(node)
node.isBoolean -> node.asBoolean()
node.isInt -> node.asInt()
node.isLong -> node.asLong()
node.isDouble -> node.doubleValue()
node.isFloat -> node.floatValue()
node.isBinary -> Base64.getEncoder().encodeToString(node.binaryValue())
node.isNull -> null
else -> TODO("Support Type: ${node.nodeType}")
}
}
}