gpt4 book ai didi

json - Serde JSON反序列化枚举

转载 作者:行者123 更新时间:2023-12-02 18:03:48 34 4
gpt4 key购买 nike

我有一个枚举:

#[derive(Serialize, Deserialize)]
enum Action {
Join,
Leave,
}

和一个结构:

#[derive(Serialize, Deserialize)]
struct Message {
action: Action,
}

然后我传递一个 JSON 字符串:

"{\"action\":0}" // `json_string` var

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

let msg: Message = serde_json::from_str(json_string)?;

我收到错误expected value at line 1 column 11

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

最佳答案

你想要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(())
}

针对您的情况:

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,
}

关于json - Serde JSON反序列化枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73768095/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com