diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt b/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt index ed63e2ca7..9f6931e6d 100644 --- a/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt +++ b/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt @@ -179,6 +179,9 @@ public sealed class Json( return decodeFromString(JsonElementSerializer, string) } + public fun parseToJsonObject(@FormatLanguage("json", "", "") string: String): JsonObject = parseToJsonElement(string).jsonObject + public fun parseToJsonArray(@FormatLanguage("json", "", "") string: String): JsonArray = parseToJsonElement(string).jsonArray + /** * Following functions are copied from extensions on StringFormat * to streamline experience for newcomers, since IDE does not star-import kotlinx.serialization.* automatically diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElement.kt b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElement.kt index 202567b77..20ec0daf0 100644 --- a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElement.kt +++ b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElement.kt @@ -347,3 +347,24 @@ internal fun unexpectedJson(key: String, expected: String): Nothing = // Use this function to avoid re-wrapping exception into NumberFormatException internal fun JsonPrimitive.parseLongImpl(): Long = StringJsonLexer(content).consumeNumericLiteralFully() + +/** + * Convenience methods to get typed elements from [JsonObject] + */ +public inline fun JsonObject.getBeanOrNull(key: String): T? = this[key]?.takeIf { it is JsonObject || it is JsonArray }?.let { Json.decodeFromString(it.toString()) } +public fun JsonObject.getJsonObject(key: String): JsonObject? = this[key]?.jsonObject +public fun JsonObject.getJsonArray(key: String): JsonArray? = this[key]?.jsonArray +public fun JsonObject.getJsonPrimitive(key: String): JsonPrimitive? = this[key]?.jsonPrimitive +public fun JsonObject.isJsonNull(key: String): Boolean = this[key] is JsonNull +public fun JsonObject.getIntOrNull(key: String): Int? = this[key]?.jsonPrimitive?.takeIf { !it.isString }?.intOrNull +public fun JsonObject.getLongOrNull(key: String): Long? = this[key]?.jsonPrimitive?.takeIf { !it.isString }?.longOrNull +public fun JsonObject.getBooleanOrNull(key: String): Boolean? = this[key]?.jsonPrimitive?.takeIf { !it.isString }?.booleanOrNull +public fun JsonObject.getDoubleOrNull(key: String): Double? = this[key]?.jsonPrimitive?.takeIf { !it.isString }?.doubleOrNull +public fun JsonObject.getFloatOrNull(key: String): Float? = this[key]?.jsonPrimitive?.takeIf { !it.isString }?.floatOrNull +public fun JsonObject.getStringOrNull(key: String): String? = this[key]?.jsonPrimitive?.takeIf { it.isString }?.contentOrNull +public fun JsonObject.getIntOrElse(key: String, default: Int): Int = getIntOrNull(key) ?: default +public fun JsonObject.getLongOrElse(key: String, default: Long): Long = getLongOrNull(key) ?: default +public fun JsonObject.getBooleanOrElse(key: String, default: Boolean): Boolean = getBooleanOrNull(key) ?: default +public fun JsonObject.getDoubleOrElse(key: String, default: Double): Double = getDoubleOrNull(key) ?: default +public fun JsonObject.getFloatOrElse(key: String, default: Float): Float = getFloatOrNull(key) ?: default +public fun JsonObject.getStringOrElse(key: String, default: String): String = getStringOrNull(key) ?: default