林一二2021年08月21日 23:36
unknown variant String, expected Id or IdList
说明用了 enum 但是没有按照文档中说明的方式标注 Tag 方案。
Tag 是动词,打标签,指帮助 serde 快速定位该用 enum 中的哪个值来解析 JSON。
Externally tagged:用 JSON 中的 key 来确定该用哪个 enum,key 得是 enum 中的 key,value 就是 enum 的 value,相当于把 enum 当 struct 用。这个是默认选项,如果没有标注 Tag 方案,JSON 中的 key 又和 enum 中的 key。
我写的 enum 没标注 Tag 方案,就只是
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CDDATileSetID {
Id(String),
IdList(Vec<String>),
}
所以 serde 会尝试在 JSON 里找叫 Id or IdList 的 key,没找到就报错。
invalid type: unit variant, expected newtype variant
尝试改成 String 之后,报的错不一样了,这个更模棱两可。
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum CDDATileSetID {
String(String),
IdList(Vec<String>),
}
Enum 的正确用法
得说明我们就是没法用某个字段来加速 serde 判断是哪个 enum 的情况,一个个试去吧。配置成 untagged 就是这个意思,这样就没报错了。
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CDDATileSetID {
String(String),
IdList(Vec<String>),
}