繁体   English   中英

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

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

我的问题很简单——我可以通过哪些方式 model 对 JSON 做出响应,例如股票价格。 假设我想 model 一个价格查询请求的 JSON 响应,它给了我股票名称和价格,例如:

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

如果我 model 这个带有枚举和serde crate,它将需要我列出大量的库存变体,即使我能设法做到这一点,它仍然会非常低效,因为不断添加新库存并且我将无法正确维护变体列表。 所以以下是不可行的:

#[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>>但您希望将其解析为更能代表数据的类型。 你能定义代表你的数据但不是枚举的结构吗? 枚举适用于数据可以采用不同的 forms 或具有不同含义的情况,但在这种情况下,每只股票在语义上似乎都是相同的。 根据 serde文档,您不需要做额外的工作来让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>>);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM