【问题标题】:How to create an arbitrary HashMap to use in rust rocket for a web API如何创建任意 HashMap 以在 Rust Rocket 中用于 Web API
【发布时间】:2023-01-08 18:21:41
【问题描述】:

我尝试用 rocket 制作一个 web API 来试用这个框架。我设法使用实现可序列化的特殊结构返回分页结果。

但是,我尝试构建的 API 依赖于特殊字典中的任意值。接收到的值可以是字符串、整数、布尔值或其他复杂对象。现在的问题是,我无法创建包含“any”的结构,因为 Any 不可序列化。

基本的想法是这样的:

#[derive(Debug, Serialize, Deserialize)]
pub struct Foobar<'a> {
    pub id: Uuid,
    pub data: HashMap<&'a str, ??????>,
}

即使使用枚举,问题仍然存在,因为有无数种变化。比方说,我使用枚举来确定字符串、布尔值、整数。当包含类型是另一种类型时,我需要该特定类型的 json 表示。基本上是另一个带有字符串的地图 - >任何。

目前的想法是使用:

#[derive(Debug, Serialize, Deserialize)]
pub struct Foobar {
    pub id: Uuid,
    pub data: HashMap<String, rocket::serde::json::Value>,
}

但我不知道当存在非 json 值(例如 msgpack)时 API 将如何运行。

有人用铁锈/火箭完成了这样的壮举吗?

【问题讨论】:

  • 澄清一下,您是从这个“特殊字典”获取数据并从 Rocket 路线返回的,对吧?这就是为什么它同时是SerializeDeserialize 的原因?数据是否不特定于每个操作,因此您可以具有特定类型并使 Foobar&lt;'a, T&gt; 本身通用?您从 Rocket 返回的数据格式是否始终采用 JSON 编码?我可能是错的,但我认为 Value 可以表达整个 serde data-model (尽管对于二进制数据等可能看起来不太好)所以使用它可能没问题。
  • 确切地。我尝试了几种选择,现在最终使用了我自己的 Value 变体。

标签: rust serialization serde rust-rocket


【解决方案1】:

在多次尝试 traits 和 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 相同。它有助于进一步检查值并根据对象的可能类型描述验证它们。

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多