当 Rust 中有太多变体时,使用枚举建模 API JSON 响应

Modeling API JSON response with enum when there are too many variants in Rust

我的问题很简单 - 我可以通过哪些方式对 JSON 响应(例如股票价格)进行建模。假设我想对价格查询请求的 JSON 响应进行建模,该请求会提供股票名称和价格,例如:

{"AAPL": {"usd": 10}, "GOOG": {"usd": 20} ...}

如果我用枚举和 serde 板条箱对其进行建模,它将要求我列出大量库存变体,即使我设法做到这一点,它仍然是效率非常低,因为不断添加新库存,我将无法正确维护变体列表。所以以下是不可行的:

#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PriceResponse {
    AAPL(HashMap<String, HashMap<String, f32>>),
    GOOG(HashMap<String, HashMap<String, f32>>),
    ...
    ...
}

我确实想利用 Rust 的类型系统让响应更“类型化”,但我不知道该怎么做。理想情况下,我想取回枚举或结构。

据我了解,您的数据格式为 HashMap<String, HashMap<String, f32>>,但您想将其解析为更能代表数据的类型。你能定义代表你的数据但不是枚举的结构吗?枚举适用于数据可以采用不同形式或具有不同含义的情况,但在这种情况下,每只股票在语义上似乎都是相同的。根据 serde documentation,您不需要做额外的工作就可以 serde 反序列化内部字段。

struct Stock(pub String);
struct CurrencyName(pub String);
struct Price(pub i32); // currencies are typically stored as integer
struct StockResponse(pub Hashmap<Stock, HashMap<CurrencyName, Price>>);