使用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/