<@U0B8ZP13Q> This JsonDeserializer cuts parses int...
# klaxon
j
@cedric This JsonDeserializer cuts parses into the
JsonObject
data type in just under 10 seconds on average.
Copy code
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}")
        }
    }
}