在Rust中有太多变体时使用enum建模API JSON响应

在Rust中有太多变体时使用enum建模API JSON响应,rust,enums,jsonresponse,Rust,Enums,Jsonresponse,我的问题很简单——我可以用什么方法来建模JSON响应,例如股票价格。假设我想对一个价格查询请求的JSON响应建模,该响应提供股票名称和价格,如: {"AAPL": {"usd": 10}, "GOOG": {"usd": 20} ...} 如果我使用enum和serdecrate对其建模,它将需要我列出大量的库存变体,即使我能设法做到这一点,它仍然会非常低效,因为不断添加新库存,我将无法正确维护变体列表。因此,以下

我的问题很简单——我可以用什么方法来建模JSON响应,例如股票价格。假设我想对一个价格查询请求的JSON响应建模,该响应提供股票名称和价格,如:

{"AAPL": {"usd": 10}, "GOOG": {"usd": 20} ...}
如果我使用enum和
serde
crate对其建模,它将需要我列出大量的库存变体,即使我能设法做到这一点,它仍然会非常低效,因为不断添加新库存,我将无法正确维护变体列表。因此,以下是不可行的:

#[派生(调试、反序列化)]
#[serde(rename_all=“小写”)]
发布枚举响应{
AAPL(HashMap),
GOOG(HashMap),
...
...
}

我确实想使用rust的类型系统使响应更“类型化”,但我不知道如何做到这一点。理想情况下,我希望返回枚举或结构。

如果我理解您的意思,您的数据的格式是
HashMap
,但您希望将其解析为更能代表数据的类型。能否定义表示数据但不是枚举的结构?枚举用于数据可以采用不同的形式或具有不同的含义,但在这种情况下,每个股票在语义上似乎是相同的。根据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>>);
struct Stock(发布字符串);
结构CurrencyName(发布字符串);
结构价格(第32号出版物);//货币通常存储为整数
struct StockResponse(pub Hashmap);

感觉就像你在试图列举那些一开始就不可列举的东西?股票并不是一个众所周知的固定清单,股票总是在交易所中添加和删除,更不用说与交易所交互的系统了。这不是枚举的作用。最好的情况下,你可以有一些特殊情况的股票,但即使这样。。。那到底有什么目的呢?货币也是一样,虽然这可能会有一定的意义,因为你可以有一个参考货币,所有其他货币都是相对的,这让特殊货币更有意义。谢谢!我认为这是最好的解决方案,尽管它引入了元组表示法,如
response.0.get()
,我并不喜欢它。我仍然不喜欢在某种货币(如
usd
)上提取股票价格所需的大量
.get()
s,但这是另一个问题。@Corel-True。您始终可以为结构实现
get
方法。当您编写接受结构的方法时,很多
.0
都消失了。当您与未编写的代码交互时,
.0
会被使用。(尽管您需要派生Debug、Hash、Eq和一系列其他特性。)我认为如果您同时实现
Deref
,一些
.0
就会消失。在某些情况下,实现
AsRef
可能会有所帮助,但我只会实现您需要的。