如何创建一个任意的HashMap在rust rocket中用于web API



我尝试用火箭做一个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相同。它有助于进一步检查值,并根据对象的可能类型描述验证它们。

相关内容

  • 没有找到相关文章

最新更新