0

我试图序列化以匹配在Rust + Serde中您使用 klaxon 执行“外部标记”枚举的方式。

这是我对 Kotlin 的定义:

@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"}

PD:关于 Rust 的定义(带有可运行测试):

#[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),
}
4

0 回答 0