kotlinx de /序列化密封类/枚举

使用kotlin编写聊天应用程序, 从nodejs的历史来看,我有/输出格式的websocket json对象:

{"action": "join:chatroom","payload","chatroom-name"}
{"action": "leave:chatroom","chatroom-name"}
{"action": "message",{"id": 1,"text": "blah","user": {"name": "Roman"}}}
{"action": "notification","verb": "blah","user": {"name": "Roman"}}}

尝试采用kotlinx序列化以能够与这种类型的方法一起工作而没有运气 似乎sealed class是我可以尝试的最接近的方法,但是如何将type更改为action

采用这种方法 https://ahsensaeed.com/sealed-classes-kotlinx-serialization-deserialization/ 尝试做类似的事情:

@Polymorphic
@Serializable
sealed class Backendaction{
    @Serializable
    data class Auth(
//        val action: String = "authorize",val payload: String = ""
    ) : Backendaction()
}

class BackendactionSerializer {
    private val sealedmodule = SerializersModule {
        polymorphic(Backendaction::class) {
            Backendaction.Auth::class with Backendaction.Auth.serializer()
        }
    }

    private val serializer: KSerializer<Backendaction>
        get() = Backendaction.serializer()

    val format: StringFormat
        get() = Json(configuration = Jsonconfiguration(classDiscriminator = "action"),context = sealedmodule)

    fun toStringT(json: String): Backendaction {
        return format.parse(serializer,json)
    }

    fun toTString(t: Backendaction): String {
        return format.stringify(serializer,t)
    }
}

并致电:

    val act = Backendaction.Auth("blah")
    val serializer = BackendactionSerializer()
    val data = serializer.toTString(act)

给予{"action":"com.project.path.Backendaction.Auth","payload":"blah"} 所以我需要将com.project.path.Backendaction.Auth映射到authorize

编辑:

回答我的问题: @SerialName("authorize") 这很容易:)

@Polymorphic
@Serializable
sealed class Backendaction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : Backendaction()
}

此聊天应用程序的工作Web ui此处: https://www.lonje.com/

iCMS 回答:kotlinx de /序列化密封类/枚举

@SerialName("authorize")可以解决问题

@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : BackendAction()
}
本文链接:https://www.f2er.com/2183889.html

大家都在问