Serde JSON 反序列化枚举

dud*_*bro 3 enums json rust serde

我有一个枚举:

#[derive(Serialize, Deserialize)]
enum Action {
    Join,
    Leave,
}
Run Code Online (Sandbox Code Playgroud)

和一个结构:

#[derive(Serialize, Deserialize)]
struct Message {
    action: Action,
}
Run Code Online (Sandbox Code Playgroud)

我传递了一个 JSON 字符串:

"{\"action\":0}" // `json_string` var
Run Code Online (Sandbox Code Playgroud)

但是当我尝试像这样反序列化时:

let msg: Message = serde_json::from_str(json_string)?;
Run Code Online (Sandbox Code Playgroud)

我得到了错误expected value at line 1 column 11

在 JSON 中,如果我用0字符串替换数字"Join",它会起作用,但我希望数字对应于Action枚举的值(0is Action::Join1is Action::Leave),因为它来自 TypeScript 请求。有没有一种简单的方法可以实现这一目标?

wis*_*sha 5

你要serde_repr

以下是该库自述文件中的示例代码:

use serde_repr::{Serialize_repr, Deserialize_repr};

#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
enum SmallPrime {
    Two = 2,
    Three = 3,
    Five = 5,
    Seven = 7,
}

fn main() -> serde_json::Result<()> {
    let j = serde_json::to_string(&SmallPrime::Seven)?;
    assert_eq!(j, "7");

    let p: SmallPrime = serde_json::from_str("2")?;
    assert_eq!(p, SmallPrime::Two);

    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

对于你的情况:

use serde_repr::{Serialize_repr, Deserialize_repr};

#[derive(Serialize_repr, Deserialize_repr)]
#[repr(u8)]
enum Action {
    Join = 0,
    Leave = 1,
}

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Message {
    action: Action,
}
Run Code Online (Sandbox Code Playgroud)