当大小写不匹配时,如何反序列化枚举?

Cas*_*eyB 7 rust serde serde-json

我有一个 JSON 结构,如下所示:

{ "type": "suite", "event": "started", "test_count": 1 }
Run Code Online (Sandbox Code Playgroud)

我想反序列化为这些结构:

#[derive(Debug, Deserialize)]
enum ResultType {
    Suite,
    Test,
}

#[derive(Debug, Deserialize)]
enum ResultEvent {
    Started,
    Failed,
    Ok,
}

#[derive(Debug, Deserialize)]
struct JsonResult {
    #[serde(rename(deserialize = "type"))]
    test_type: ResultType,
    event: ResultEvent,
    test_count: Option<u32>,
}
Run Code Online (Sandbox Code Playgroud)

我找不到让 serde_json 使用正确大小写的方法。我不断收到这些错误:

{ "type": "suite", "event": "started", "test_count": 1 }
Run Code Online (Sandbox Code Playgroud)

如果我将枚举值的大小写更改为全部小写或全部大写,则它可以工作,但我希望能够使用 PascalCase。

Cod*_*256 17

你只需要放在#[serde(rename_all = "snake_case")]枚举定义之前。

其他可能的值是lowercaseUPPERCASEPascalCasecamelCasesnake_caseSCREAMING_SNAKE_CASEkebab-case,和SCREAMING-KEBAB-CASE

  • 我需要“小写”,但这确实是解决办法!谢谢你! (3认同)

gov*_*ovo 9

如果你想支持不同的大小写,你可以alias在枚举变体上添加一个:

enum ResultType {
    #[serde(alias="suite", alias="SUITE")]
    Suite,
    #[serde(alias="test", alias="TEST")]
    Test,
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下, 、"Suite""suite"都是"SUITE"可以接受的。

而任何其他类似的情况"sUitE",一定有问题。


M. *_*ard 8

用于#[serde(rename = "name")]在序列化和反序列化时更改用于枚举变量的字符串。

#[derive(Debug, Deserialize)]
enum ResultType {
    #[serde(rename = "suite")]
    Suite,
    #[serde(rename = "test")]
    Test,
}

#[derive(Debug, Deserialize)]
enum ResultEvent {
    #[serde(rename = "started")]
    Started,
    #[serde(rename = "failed")]
    Failed,
    #[serde(rename = "ok")]
    Ok,
}

#[derive(Debug, Deserialize)]
struct JsonResult {
    #[serde(rename(deserialize = "type"))]
    test_type: ResultType,
    event: ResultEvent,
    test_count: Option<u32>,
}

Run Code Online (Sandbox Code Playgroud)

您还可以#[serde(alias = "name")]在反序列化时添加额外的字符串以接受。

详细信息请参阅 serde 文档:https://serde.rs/variant-attrs.html