3
votes

Sérialisation Kotlinx - sérialiseur personnalisé pour ignorer la valeur nulle

Disons que j'ai un cours comme:

{ "b": "b value" }

Supposons que l' a est null et b La valeur de la « valeur de b », puis Json.stringify(MyClass.serializer(), this) produit:

{ "a": null, "b": "b value" }

Fondamentalement, si a est null , je voulais obtenir ceci:

@Serializable
data class MyClass(
    @SerialName("a") val a: String?,
    @SerialName("b") val b: String
)

D'après certaines recherches, j'ai trouvé que ce n'était actuellement pas faisable avec la sérialisation Kotlinx, donc j'essayais de créer un sérialiseur personnalisé pour ignorer explicitement la valeur null . J'ai suivi le guide à partir d' ici mais je n'ai pas pu en faire un bon.

Quelqu'un peut-il s'il vous plaît me faire la lumière? Merci.


0 commentaires

3 Réponses :


1
votes

Essayez ceci (non testé, juste en adaptant l'exemple):

@Serializable
data class MyClass(val a: String?, val b: String) {
    @Serializer(forClass = MyClass::class)
        companion object : KSerializer<MyClass> {
        override val descriptor: SerialDescriptor = object : SerialClassDescImpl("MyClass") {
            init {
                addElement("a")
                addElement("b")
            }
        }

        override fun serialize(encoder: Encoder, obj: MyClass) {
            encoder.beginStructure(descriptor).run {
                obj.a?.let { encodeStringElement(descriptor, 0, obj.a) }
                encodeStringElement(descriptor, 1, obj.b)
                endStructure(descriptor)
            }
        }

        override fun deserialize(decoder: Decoder): MyClass {
            var a: String? = null
            var b = ""

            decoder.beginStructure(descriptor).run {
                loop@ while (true) {
                    when (val i = decodeElementIndex(descriptor)) {
                        CompositeDecoder.READ_DONE -> break@loop
                        0 -> a = decodeStringElement(descriptor, i)
                        1 -> b = decodeStringElement(descriptor, i)
                        else -> throw SerializationException("Unknown index $i")
                    }
                }
                endStructure(descriptor)
            }

            return MyClass(a, b)
        }
    }
}


0 commentaires

2
votes

Utilisez la propriété encodeDefaults = false dans JsonConfiguration et il ne sérialisera pas les valeurs nulles (ou d'autres valeurs facultatives)


0 commentaires

-1
votes

JsonConfiguration est obsolète au profit de Json {} builder depuis kotlinx.serialization 1.0.0-RC selon son changelog .

Maintenant, vous devez coder comme ceci:

val json = Json { encodeDefaults = false }
val body = json.encodeToString(someSerializableObject)


0 commentaires