Eu tenho uma classe de dados com uma propriedade calculada:
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class Mcve (
val account: String
) {
@SerialName("type")
val type =
if (account.startsWith("1"))
"preferred"
else
"regular"
}
fun main() {
println(Json.encodeToString(Mcve.serializer(), Mcve("12345")))
}
Quero que essa type
propriedade seja serializada, mas a estrutura de serialização a ignora. O acima main
apenas imprime:
{"account":"12345"}
Tentei usar lazy
como abaixo, mas o resultado é o mesmo, type
não está incluso no JSON.
@SerialName("type")
val type : String by lazy {
if (account.startsWith("1"))
"preferred"
else
"regular"
}
Como posso incluir no type
objeto JSON?
Este recurso não é fornecido atualmente pela biblioteca, como atesta o problema do GitHub vinculado por @AlexT nos comentários. Parece que os autores da biblioteca serão forçados a analisar isso novamente em um futuro próximo, já que Kotlin implementará em breve um novo recurso de campos de apoio .
Observo que isso não é um problema se você estiver serializando para transferir um objeto entre dois programas Kotlin que compartilham a definição de classe em código comum, pois o desserializador recriará a propriedade quando a classe for instanciada. Mas é quando, como provavelmente no seu caso, você está passando o objeto para um destinatário que não seja Kotlin.
A maneira de resolver o problema por enquanto é usar um serializador substituto 1 . No seu caso, isso seria escrever uma nova classe para representar a forma de JSON que você deseja com a
type
propriedade como uma propriedade regular:Então você pode usar isso como base para um novo serializador:
E finalmente você pode instruir o framework para usar isso em sua classe original:
1 Este é um padrão muito comum se você for usar esta estrutura regularmente e com classes não padrão.