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.
3 Réponses :
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) } } }
Utilisez la propriété encodeDefaults = false
dans JsonConfiguration
et il ne sérialisera pas les valeurs nulles (ou d'autres valeurs facultatives)
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)