All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.io.ks3.standard.LenientJsonArraySerializer.kt Maven / Gradle / Ivy

The newest version!
package io.ks3.standard

import io.ks3.core.ExperimentalKs3
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerializationException
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.serializer

/**
 * Creates a serializer that will parse a JSON array into a list of [T] elements, ignoring any elements that fail to parse.
 *
 * Example:
 * ```
 * val lenientIntListSerializer = lenientJsonArraySerializer()
 * val numbers = Json.decodeFromString(lenientIntListSerializer, "[1,2,3, \"foo\",5]")
 *
 * println(numbers) // > [1, 2, 3, 5]
 * ```
 */
@ExperimentalKs3
inline fun  lenientJsonArraySerializer(explicitElementSerializer: KSerializer? = null) =
   object : KSerializer> {
      private val elementSerializer = explicitElementSerializer ?: serializer()
      private val serializer: SerializationStrategy> = ListSerializer(elementSerializer)
      override val descriptor: SerialDescriptor = serializer.descriptor

      override fun deserialize(decoder: Decoder): List {
         require(decoder is JsonDecoder) { "This deserializer can only be used with Json" }
         val json = decoder.json
         val list = decoder.decodeJsonElement()
         return list
            .jsonArray
            .mapNotNull {
               try {
                  json.decodeFromJsonElement(elementSerializer, it)
               } catch (e: SerializationException) {
                  null
               } catch (e: IllegalArgumentException) {
                  null
               }
            }
      }

      override fun serialize(
         encoder: Encoder,
         value: List,
      ): Unit = serializer.serialize(encoder, value)
   }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy