我尝试用火箭做一个web API来尝试这个框架。我设法用一个实现serializable的特殊结构体返回分页结果。
但是,我尝试构建的API依赖于一个特殊字典中的任意值。接收到的值可以是字符串、整数、bool或其他复杂对象。现在的问题是,我不能创建一个包含&;any&;的结构体;因为Any
是不可序列化的。
基本思想是这样的:
#[derive(Debug, Serialize, Deserialize)]
pub struct Foobar<'a> {
pub id: Uuid,
pub data: HashMap<&'a str, ??????>,
}
即使是枚举,这个问题仍然存在,因为有无限的变量计数。比方说,我用枚举来确定字符串,bool和整数。当包含类型是另一种类型时,我需要该特定类型的json表示。基本上是另一个带有字符串->任何.
当前的想法是使用:
#[derive(Debug, Serialize, Deserialize)]
pub struct Foobar {
pub id: Uuid,
pub data: HashMap<String, rocket::serde::json::Value>,
}
但是我不知道当有非json值(例如msgpack)时API将如何处理。
有人用铁锈/火箭完成了这样的壮举吗?经过几次性状和std::any::Any
的尝试,我最终得到:
pub type DataObject = HashMap<String, DataValue>;
#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub enum DataValue {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Date(String),
Time(String),
DateTime(String),
Reference(DataObject),
ArrayReference(Vec<DataObject>),
}
这或多或少与serde_json::Value
相同。它有助于进一步检查值,并根据对象的可能类型描述验证它们。