#json #kotlin #enums #serde #klaxon
Вопрос:
Я пытаюсь сериализовать, чтобы соответствовать тому, как в Rust Serde вы делаете перечисление «с внешней меткой» с помощью клаксона.
Это мое определение по Котлину:
@TypeFor(field = "type", adapter = QueryTypeAdapter::class)
open class Query(val type: QueryType)
data class StartTravel(val from:Coordinates, val to:Coordinates): Query(QueryType.StartTravel)
class SearchingDriver: Query(QueryType.SearchDriver)
data class Fail(val error:JsonError): Query(QueryType.Fail)
class QueryTypeAdapter: TypeAdapter<Query> {
override fun classFor(type: Any): KClass<out Query> = when(type as QueryType) {
QueryType.StartTravel-> StartTravel::class
QueryType.SearchDriver -> SearchingDriver::class
QueryType.Fail -> Fail::class
}
}
Мне это нужно для десериализации, как:
{"StartTravel":{"from":{"lat":0.0,"long":0.0},"to":{"lat":0.0,"long":0.0}}}
Но сейчас:
{"from" : {"lat" : 0.0, "long" : 0.0}, "to" : {"lat" : 0.0, "long" : 0.0}, "type" : "StartTravel"}
P. D: Определение ржавчины (с возможностью выполнения теста):
#[derive(Debug, Deserialize, Serialize)]
pub struct JsonError {
pub kind: String,
pub message: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Coordinates {
lat: f64,
long: f64,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct StartTravel {
from: Coordinates,
to: Coordinates,
}
#[derive(Debug, Deserialize, Serialize)]
pub enum QueryType {
StartTravel(StartTravel),
SearchingDriver,
Fail(JsonError),
}