tgbotapi/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt

55 lines
1.6 KiB
Kotlin

package com.github.insanusmokrassar.TelegramBotAPI.utils
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.json.*
internal val nonstrictJsonFormat = Json {
isLenient = true
ignoreUnknownKeys = true
allowSpecialFloatingPointValues = true
useArrayPolymorphism = true
}
fun <T: Any> T.toJsonWithoutNulls(serializer: SerializationStrategy<T>): JsonObject = toJson(serializer).withoutNulls()
fun <T: Any> T.toJson(serializer: SerializationStrategy<T>): JsonObject = nonstrictJsonFormat.encodeToJsonElement(
serializer,
this
).jsonObject
fun JsonArray.withoutNulls(): JsonArray {
return buildJsonArray {
forEach {
when (it) {
is JsonObject -> add(it.withoutNulls())
is JsonArray -> add(it.withoutNulls())
is JsonPrimitive -> add(it)
}
}
}
}
fun JsonObject.withoutNulls(): JsonObject {
return buildJsonObject {
forEach { (k, v) ->
when (v) {
is JsonObject -> put(k, v.withoutNulls())
is JsonArray -> put(k, v.withoutNulls())
!is JsonNull -> put(k, v)
JsonNull -> {
// do nothing
}
}
}
}
}
fun JsonObject.mapWithCommonValues(): Map<String, Any> = map {
(key, value) ->
key to when (value) {
is JsonPrimitive -> value.contentOrNull ?: value.booleanOrNull ?: value.doubleOrNull ?: value.floatOrNull ?: value.intOrNull
is JsonArray, is JsonObject -> value.toString()
is JsonNull -> null
}
}.toMap().mapNotNullValues()