伙计们,我陷入了一个非常简单的问题
strum
和
serde
板条箱是锈的。
首先,我在下面有一个结构:
use enums::Timezone;
use crate::CustomError;
use serde::{Deserialize, Serialize};
use serde_json::{from_str, to_string};
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct LocaleConfig {
pub timezone: Timezone,
pub language: String,
}
impl LocaleConfig {
fn from_json_str(json_str: &str) -> Result<Self, CustomError> {
from_str(json_str)?
}
正如你所看到的,我正在使用
Timezone
枚举如下:
use serde::{Deserialize, Serialize};
use strum_macros::{Display, EnumIter, EnumString};
#[derive(Clone, Copy, Deserialize, Serialize, Debug, PartialEq, EnumString, EnumIter, Display)]
pub enum Timezone {
#[serde(rename = "GMT-12")]
#[strum(serialize = "GMT-12")]
UTCm12,
#[serde(rename = "GMT-11")]
#[strum(serialize = "GMT-11")]
UTCm11,
...
#[serde(rename = "GMT+11")]
#[strum(serialize = "GMT+11")]
UTCp11,
#[serde(rename = "GMT+12")]
#[strum(serialize = "GMT+12")]
UTCp12,
}
问题是,当我尝试反序列化时:
let json = r#"{"timezone":"GMT-5","language":"en-US"}"#;
具有
LocaleConfig::from_json_str
我得到以下错误:
Custom Error { title: "Serde Json Error", description: "unknown variant `timezone`, expected `Ok` or `Err` at line 1 column 11" }
正如你所推断的,
CustomError
只是包装我的板条箱错误。此外,请注意
LocaleConfig
和
时区
位于不同的模块中。
enums/货物.toml
[package]
name = "enums"
[dependencies]
serde = { workspace = true }
serde_json = { workspace = true }
strum = { version = "0.26.2" }
strum_macros = { version = "0.26.2" }
配置/货物.toml
[package]
name = "config"
[dependencies]
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
enums = { workspace = true }
最后,我的虚拟清单使用以下版本:
[workspace.dependencies.serde]
serde = { version = "1.0.197", features = ["derive"] }
[workspace.dependencies.serde_json]
version = "1.0.114"
我在这里错过了什么?我的意思是,当我跑步时:
Timezone::from_str("GMT-5");
,我答对了
enum
,但我知道
desererialize
fn
正在运行可能会有所不同。
对这件事有什么见解吗?